Java jlink软件包当前平台';s二进制文件

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打包正确的

我正在尝试为使用Java11构建并使用
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文件