Java 9:使用第三方jar生成JLink的运行时映像

时间:2018-01-23 18:24:54

标签: java java-9 jlink

我想创建一个包含第三方jar的Java 9运行时映像。我创建了一个简单的Java项目(让我们称之为Example)来调用实用程序jar(让我们称之为ExampleUtil.jar)。 Example包含module-info.java目录中的src,并且在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

有没有办法使用非模块的jar创建运行时映像?谢谢。

2 个答案:

答案 0 :(得分:14)

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

  

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

注意缺少“普通JAR”(即没有描述符的JAR)。

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

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

答案 1 :(得分:0)

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

您可以使用特殊的Maven插件之类的工具来自动执行该任务。