如何在 Java9 模块中使用 3rd 方库?
How to use 3rd party library in Java9 module?
我有一些 java9 模块使用了不是 Java9 模块的第 3 方库,只是一个简单的实用程序 jar。
但是,编译器抱怨它无法从我的实用程序中找到包。
我应该在 module-info.java
中做什么才能启用我的第 3 方库?
您可以将您的库用作自动模块。自动模块是没有模块描述符的模块(即 module-info.class
)。
但是您需要指定什么名称来引用自动模块?自动模块的名称源自 JAR 名称(除非此 JAR 包含 Automatic-Module-Name
属性)。完整的规则很长(请参阅 Javadoc ModuleFinder.of
),因此为简单起见,您只需从其名称中删除版本,然后将所有非字母数字字符替换为点 (.
)。
例如,如果要使用foo-bar-1.2.3-SNAPSHOT.jar
,则需要在module-info.java
中添加以下行:
module <name> {
requires foo.bar;
}
简单来说,在您的模块中使用第 3 方 jar(例如下面的 log4j-api-2.9.1.jar
):-
执行jar
工具的描述符命令
jar --file=/path/to/your/jar/log4j-api-2.9.1.jar --describe-module
这将为您提供类似于
的输出
No module descriptor found. Derived automatic module.
log4j.api@2.9.1 automatic
在您的模块描述符文件中,将 requires
声明为该模块名称:-
module your.module {
requires log4j.api;
}
就是这样。
我有一些 java9 模块使用了不是 Java9 模块的第 3 方库,只是一个简单的实用程序 jar。
但是,编译器抱怨它无法从我的实用程序中找到包。
我应该在 module-info.java
中做什么才能启用我的第 3 方库?
您可以将您的库用作自动模块。自动模块是没有模块描述符的模块(即 module-info.class
)。
但是您需要指定什么名称来引用自动模块?自动模块的名称源自 JAR 名称(除非此 JAR 包含 Automatic-Module-Name
属性)。完整的规则很长(请参阅 Javadoc ModuleFinder.of
),因此为简单起见,您只需从其名称中删除版本,然后将所有非字母数字字符替换为点 (.
)。
例如,如果要使用foo-bar-1.2.3-SNAPSHOT.jar
,则需要在module-info.java
中添加以下行:
module <name> {
requires foo.bar;
}
简单来说,在您的模块中使用第 3 方 jar(例如下面的 log4j-api-2.9.1.jar
):-
执行
jar
工具的描述符命令jar --file=/path/to/your/jar/log4j-api-2.9.1.jar --describe-module
这将为您提供类似于
的输出No module descriptor found. Derived automatic module. log4j.api@2.9.1 automatic
在您的模块描述符文件中,将
requires
声明为该模块名称:-module your.module { requires log4j.api; }
就是这样。