【发布时间】:2021-05-10 23:38:26
【问题描述】:
我正在尝试构建使用 Java 11 构建并使用 jlink 打包的应用程序的跨平台存档。
对于跨平台打包,我的构建基于this answer。我已经设法让我的 Gradle 构建下载目标平台的 JDK 并使用适当的 jmods 文件夹调用 jlink,但是目标映像始终包含主机平台的二进制文件和 JRE 结构(在我的情况下是 Windows,这意味着生成的bin 文件夹始终包含 DLL 和 Windows 可执行文件)。如果我提供 --strip-native-commands 标志,则根本不包含任何可执行文件,尽管 DLL 仍然存在。
有没有办法让jlink 打包正确的JRE 文件?
宿主 JDK: Windows Oracle JDK 11.0.10 x64
目标 JDK: OpenJDK 11.0.2 x64
Linux 调用示例:
C:\Program Files\Java\jdk-11.0.10/bin/jlink.exe
--module-path C:\projectdir\build\install\project-linux\lib;C:\projectdir\build\JREs\linux\jmods
--add-modules com.acme.app
--compress 2
--launcher app=com.acme.app/com.acme.app.Main
--no-header-files
--no-man-pages
--strip-debug
--dedup-legal-notices=error-if-not-same-content
--output C:\projectdir\build\packageFiles\linux
GraalVM
使用GraalVM CE Java 11 21.0.0 产生:
java.io.IOException: Invalid JMOD file: C:\jdks\graalvm-ce-java11-21.0.0\jmods\java.base.jmod
这使得 GraalVM 的 jlink 看起来总是尝试使用主机的 JMOD 文件。
OpenJDK
使用OpenJDK 11.0.2 x64 会产生相同的结果,即在创建的运行时映像中包含主机的二进制文件。 Zulu OpenJDK 11.0.10+9 x64 的行为相同。
【问题讨论】:
标签: java java-11 java-module graalvm jlink