21

我有一些使用不是 Java9 模块的 3rd 方库的 java9 模块,只是一个简单的实用程序 jar。

但是,编译器抱怨它无法从我的实用程序中找到包。

我应该怎么做module-info.java才能使用我的 3rd 方库?

4

2 回答 2

26

您可以将您的库用作自动模块。自动模块是没有模块描述符(即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;
}
于 2017-10-12T16:00:23.010 回答
11

简而言之,log4j-api-2.9.1.jar在您的模块中使用第 3 方 jar(例如下面):-

  1. 执行jar工具的描述符命令

     jar --file=/path/to/your/jar/log4j-api-2.9.1.jar --describe-module
    

    这将为您提供类似于

    未找到模块描述符。派生自动模块log4j.api @2.9.1 自动

  2. 在您的模块描述符文件中,requires将该模块名称声明为:-

     module your.module {
         requires log4j.api;
     }
    

而已。

于 2017-10-12T17:44:40.147 回答