【问题标题】:How to use 3rd party library in Java9 module?如何在 Java9 模块中使用 3rd 方库?
【发布时间】:2017-10-12 15:19:57
【问题描述】:

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

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

我应该在 module-info.java 中做些什么来启用我的 3rd 方库?

【问题讨论】:

    标签: java java-9 modularity java-module java-platform-module-system


    【解决方案1】:

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

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

    例如,如果要使用foo-bar-1.2.3-SNAPSHOT.jar,则需要在module-info.java中添加以下行:

    module <name> {
        requires foo.bar;
    }
    

    【讨论】:

    • 谢谢!有趣的是我这样做了,但我的 IntelliJ 仍在抱怨。在我重新启动 IDEA 后,就没有更多问题了。谢谢!
    • 在某些情况下无法派生模块描述符。有没有办法定义一个别名来覆盖无效的自动名称而不更改 3thparty 库?另见stackoverflow.com/questions/46501388/…
    • @Stefan 更改 jar 名称不是一种选择?
    • 不是真的,因为我依赖很多 jar 文件并且我希望能够获得更新。由于无法为 module-info.java 中的自动模块名称失败定义别名或后备 jar ...我决定等待包含正确模块定义的 3thparty 库(Eclipse 插件)的新版本。另见stackoverflow.com/questions/47773079/…
    【解决方案2】:

    简单地说,在你的模块中使用第 3 方 jar(例如下面的log4j-api-2.9.1.jar):-

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

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

      这将为您提供类似于

      的输出

      找不到模块描述符。派生 automatic modulelog4j.api@2.9.1 自动

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

       module your.module {
           requires log4j.api;
       }
      

    就是这样。

    【讨论】:

      猜你喜欢
      • 2021-10-02
      • 1970-01-01
      • 1970-01-01
      • 2016-10-20
      • 2017-12-09
      • 1970-01-01
      • 2014-03-30
      • 2016-01-28
      • 1970-01-01
      相关资源
      最近更新 更多