我想创建一个包含第三方jar的Java 9运行时映像。我做了一个简单的Java项目(我们称之为Example
(来调用实用程序jar(我们称之为ExampleUtil.jar
(。 Example
包含 src
目录中的module-info.java
,并且在 Eclipse 中运行良好(我已添加ExampleUtil.jar
作为模块依赖项(。
如果我打电话:
jlink -v
--module-path "C:Program FilesJavajdk-9.0.4jmods";C:Temp
--add-modules com.example.steven
--output C:Tempimage.steven
--launcher launch=com.example.steven/com.example.steven`
。我收到错误消息:
错误:找不到示例实用程序模块的模块信息.class
有没有办法使用不是模块的 jar 创建运行时映像?
不,jlink 要求所有包含的模块都是显式的,这意味着它们需要有一个模块描述符。以下是文档对 jlink 模块路径的说明:
jlink 工具发现可观察模块的路径。这些模块可以是模块化 JAR 文件、JMOD 文件或松散模块。
请注意,没有"普通 JAR"(即没有描述符的 JAR(。
不过,您可以将现有的第三方 JAR 升级到模块化 JAR(需要付出一些努力(。步骤如下:
- 获取 JAR 及其所有依赖项
- 为其创建
module-info.java
(手动或使用 JDeps( - 将其编译为
module-info.class
--patch-module
告诉编译器有关源代码的信息 - 使用
jar --update
将模块声明添加到现有 JAR
或者,您可以使用像ModiTect这样的工具为您完成这些事情。
jlink直接做不到这一点。诀窍是在所有外部库上调用 jdeps 以收集其系统模块依赖项,然后相应地修改参数以 jlink。生成模块信息.java并不总是能解决问题,但您可以使用 jdeps 查看您需要哪些系统模块,然后使用 jlink 创建自定义 Java 运行时,其中包含所有这些系统依赖项,并将外部库放在类路径或模块路径上,具体取决于它们是非模块化 jar 还是自动模块 jar。
您可以使用类似特殊 maven 插件之类的东西来自动执行该任务。