如何在Java9模块中使用第三方库?

22

我有一些使用第三方库的Java9模块,该库不是Java9模块,而只是一个简单的工具jar文件。

然而,编译器抱怨无法找到我的工具程序包中的一个包。

module-info.java中我应该怎么做才能启用对我第三方库的使用?

2个回答

27

你可以将你的库用作“自动模块”(automatic module)。自动模块是没有模块描述符(即 module-info.class)的模块。

但是,指定自动模块的名称时需要什么名称呢?除非该 JAR 包含一个 Automatic-Module-Name 属性,否则自动模块的名称是从 JAR 的名称派生而来。完整的规则相当冗长(请参阅 Javadoc 文档中的 ModuleFinder.of),因此,简单起见,您只需删除其名称中的版本,然后将所有非字母数字字符替换为点号(.)。

例如,如果您想要使用 foo-bar-1.2.3-SNAPSHOT.jar,您需要将以下行添加到 module-info.java

module <name> {
    requires foo.bar;
}

3
谢谢!有趣的是我确实这么做了,但我的IntelliJ仍然在抱怨。在我重启IDEA后,问题就解决了。谢谢! - igr
在某些情况下,可能无法派生模块描述符。有没有一种方法可以定义别名来覆盖无效的自动名称,而不更改第三方库?另请参见https://dev59.com/RlYO5IYBdhLWcg3wBdB5 - Stefan
@Stefan 更改jar文件名不是一个选项吗? - ZhekaKozlov
并不是因为我依赖很多jar文件,而且我想能够获得更新。由于在module-info.java中没有定义别名或回退jar的方法来处理自动模块名称失败...所以我决定等待新版本的第三方库(Eclipse插件),包括适当的模块定义。另请参见https://dev59.com/EKfja4cB1Zd3GeqPwHUx - Stefan

14

简单来说,要在模块中使用第三方 jar(例如下面的 log4j-api-2.9.1.jar),请按以下步骤操作:

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

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

这将为您提供类似于以下输出:

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

  • 在您的模块描述符文件中,声明一个requires到该模块名称:

     module your.module {
         requires log4j.api;
     }
    
  • 就这些。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接