2017-10-12 119 views
6

我有一些java9模块使用不是Java9模块的第三方库,只是一个简单的实用程序jar。如何在Java9模块中使用第三方库?

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

我应该怎么做module-info.java以启用我的第三方库?

回答

5

您可以使用自己的库作为自动模块。自动模块是没有模块描述符的模块(即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; 
} 
+1

谢谢!有趣的是我做到了,但是我的IntelliJ仍然在抱怨。在重新启动IDEA后,没有更多的问题。感谢名单! – igr

+0

在某些情况下,不能派生出模块描述符。有没有办法定义一个别名来覆盖无效的自动名称而不需要改变第三方库?另请参阅https://stackoverflow.com/questions/46501388/unable-to-derive-module-descriptor-for-auto-generated-module-names-in-java-9 – Stefan

+0

@Stefan更改jar名称不是一个选项? – ZhekaKozlov

2

只是把简单的步骤,使用第三方JAR(例如低于log4j-api-2.9.1.jar)在你的模块: -

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

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

    这会为您提供类似

    没有找到模块描述符的输出。衍生automatic module

    log4j.api @ 2.9.1自动

  2. 在你module-info.java,申报requires该模块的名称为: -

    module your.module { 
        requires log4j.api; 
    } 
    

    就是这样。

相关问题