【问题标题】:Java 9: Generating a runtime image with JLink using 3rd party jarsJava 9:使用 JLink 使用 3rd 方 jar 生成运行时映像
【发布时间】:2018-07-02 16:05:23
【问题描述】:

我想创建一个包含 3rd 方 jar 的 Java 9 运行时映像。我制作了一个简单的 Java 项目(我们称之为 Example)来调用实用程序 jar(我们称之为 ExampleUtil.jar)。 Examplesrc 目录中包含 module-info.java 并在 Eclipse 中运行良好(我已将 ExampleUtil.jar 添加为模块依赖项)。如果我打电话:

jlink -v
    --module-path "C:\Program Files\Java\jdk-9.0.4\jmods";C:\Temp
    --add-modules com.example.steven
    --output C:\Temp\image.steven
    --launcher launch=com.example.steven/com.example.steven`

...我收到错误消息:

错误:找不到 ExampleUtil 模块的 module-info.class

有没有办法使用不是模块的 jars 创建运行时映像?谢谢。

【问题讨论】:

  • jlink 需要所有模块都是显式模块,自动模块中不支持链接。

标签: java java-9 jlink


【解决方案1】:

不,jlink 要求所有包含的模块都是显式,这意味着它们需要有一个模块描述符。以下是 the documentation 关于 jlink 模块路径的说明:

jlink 工具发现可观察模块的路径。这些模块可以是模块化 JAR 文件、JMOD 文件或分解模块。

注意没有“plain JAR”(即没有描述符的 JAR)。

不过,您可以将现有的第三方 JAR 升级为模块化 JAR(需要付出一些努力)。步骤是:

或者,您可以使用像 ModiTect 这样的工具来为您完成这些事情。

【讨论】:

  • 哇...这使得 jlink 在可预见的未来从难以使用变为无用。
  • 解决这个问题的一种方法是创建一个名为“Commons”或类似名称的新模块化项目。然后将所有源文件(来自遗留 jars)放入该项目,然后将该项目“导入”为您实际项目的依赖项。这意味着,一旦更新了这些 jar 以包含对模块的支持,然后删除源并添加 jar。
【解决方案2】:

jlink 直接不能这样做。诀窍是在所有外部库上调用 jdeps 以收集它们的系统模块依赖关系,然后相应地修改参数到 jlink。生成 module-info.java 并不总能解决问题,但您可以使用 jdeps 查看您需要哪些系统模块,然后使用 jlink 创建自定义 Java 运行时,其中包含所有这些系统依赖项并将外部库放在类路径中或模块路径取决于它们是非模块化 jar 还是自动模块 jar。

您可以使用特殊的 maven 插件之类的东西来自动执行该任务。

【讨论】:

  • 手动或自动添加 module-info.java 可能会破坏 jar 的可用性,因为当类位于模块路径而不是类路径时,某些事情的工作方式会有所不同。
猜你喜欢
  • 2018-03-06
  • 2020-05-10
  • 2019-11-06
  • 2018-05-15
  • 1970-01-01
  • 2023-03-12
  • 2016-11-24
  • 2012-08-01
相关资源
最近更新 更多