Java jlink软件包当前平台';s二进制文件
我正在尝试为使用Java11构建并使用Java jlink软件包当前平台';s二进制文件,java,java-11,java-module,graalvm,jlink,Java,Java 11,Java Module,Graalvm,Jlink,我正在尝试为使用Java11构建并使用jlink打包的应用程序构建跨平台归档 对于跨平台打包,我的构建基于。我已经设法让我的Gradle build下载目标平台的JDK,并使用适当的jmods文件夹调用jlink,但是目标映像始终包括主机平台的二进制文件和JRE结构(在我的Windows中,这意味着生成的bin文件夹始终包含DLL和Windows可执行文件)。如果我提供--strip native commands标志,则不包含任何可执行文件,尽管DLL仍然存在 有没有办法使jlink打包正确的
jlink
打包的应用程序构建跨平台归档
对于跨平台打包,我的构建基于。我已经设法让我的Gradle build下载目标平台的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
,发现问题:问题在于我引用了Linux和MacOS JDK发行版的jmods
目录。
对于Linux one,我错误地将构建设置为下载版本11.0.1
,而不是11.0.2
,这最终导致逻辑分层,而不是分层。这意味着build/JREs/Linux/jmods
引用没有针对任何现有文件夹,这意味着jlink
不支持d JDK模块,因此包含主机文件
MacOS JDK有一个完全不同的文件结构,所以扁平化逻辑是错误的。这最终导致了相同的缺少jmods
文件夹症状
这两个问题都解决了,在构建跨平台运行时映像时,jlink工具现在可以正确地打包目标JDK文件