使用第 3 方 jar 通过 JLink 生成运行时映像

问题描述 投票:0回答:3

我想创建一个包含第 3 方 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 文件创建运行时映像?

java java-9 jlink
3个回答
21
投票

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

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

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

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

获取 JAR 及其所有依赖项
  • 为其创建一个
  • module-info.java
  • (手动或使用 JDeps)
    将其编译为 
  • module-info.class
  • --patch-module 告诉编译器有关来源的信息
    
    
    使用
  • jar --update
  • 将模块声明添加到现有 JAR
    
    
    
  • 或者,您可以使用像
ModiTect

这样的工具来为您做这些事情。


1
投票

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


0
投票
here

看到解释。您可以使用 jdeps 命令查找 jvm 模块,它可以分析模块和类路径。示例 jdeps --module-path <your modul path> -cp <your classpath> -m <your root module> --list-deps

此示例适用于您的主 jar 是模块的情况,但这不是必需的。
获得模块列表后,您可以像这样创建运行时 jre 映像

jlink --no-header-files --no-man-pages --add-modules <modules list you get from jdeps> --output <output dir>

现在我不确定从理论角度来看是否可以保证 jdeps 可以从类路径“常规”jar 中找到所需的模块。我猜在某些情况下可能会丢失,所以结果需要测试,但是丢失模块的错误是明确的,你可以将其添加到jlink列表中。

© www.soinside.com 2019 - 2024. All rights reserved.