jlink 打包当前平台的二进制文件
jlink packages current platform's binaries
我正在尝试为使用 Java 11 构建并使用 jlink
.
打包的应用程序构建跨平台存档
对于跨平台打包,我的构建基于 。我已经设法使我的 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 文件。
打开JDK
使用OpenJDK 11.0.2 x64
产生与在创建的运行时映像中包含主机的二进制文件相同的结果。 Zulu OpenJDK 11.0.10+9 x64
.
的行为相同
发现问题:问题出在我对 Linux 和 MacOS JDK 发行版的 jmods
目录的引用上。
对于 Linux,我错误地将构建设置为下载版本 11.0.1
而不是 11.0.2
,这最终导致逻辑扁平化层次结构而不是扁平化它。这意味着 build/JREs/linux/jmods
引用没有针对任何现有文件夹,这意味着 jlink
没有在那里找到 JDK 模块,因此主机文件被包含在内。
MacOS JDK 具有完全不同的文件结构,因此扁平化逻辑是错误的。最终这会导致相同的丢失 jmods
文件夹症状。
解决了这两个问题后,jlink
工具现在可以在构建跨平台运行时映像时正确打包目标 JDK 的文件。
我正在尝试为使用 Java 11 构建并使用 jlink
.
对于跨平台打包,我的构建基于 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 文件。
打开JDK
使用OpenJDK 11.0.2 x64
产生与在创建的运行时映像中包含主机的二进制文件相同的结果。 Zulu OpenJDK 11.0.10+9 x64
.
发现问题:问题出在我对 Linux 和 MacOS JDK 发行版的 jmods
目录的引用上。
对于 Linux,我错误地将构建设置为下载版本 11.0.1
而不是 11.0.2
,这最终导致逻辑扁平化层次结构而不是扁平化它。这意味着 build/JREs/linux/jmods
引用没有针对任何现有文件夹,这意味着 jlink
没有在那里找到 JDK 模块,因此主机文件被包含在内。
MacOS JDK 具有完全不同的文件结构,因此扁平化逻辑是错误的。最终这会导致相同的丢失 jmods
文件夹症状。
解决了这两个问题后,jlink
工具现在可以在构建跨平台运行时映像时正确打包目标 JDK 的文件。