当前位置: 首页 > 知识库问答 >
问题:

jlink封装了当前平台的二进制文件

郜光明
2023-03-14

我试图构建一个应用程序的跨平台归档,该应用程序使用Java11构建,并用JLink打包。

对于跨平台打包,我的构建基于这个答案。我已经设法让我的Gradle构建下载目标平台的JDK,并使用适当的jmods文件夹调用jlink,但是目标映像始终包括主机平台的二进制文件和JRE结构(在我的例子中是Windows,这意味着生成的bin文件夹始终包括DLL和Windows可执行文件)。如果提供--strip-native-commands标志,则根本不包括可执行文件,尽管DLL仍然是。

有什么方法可以让jlink打包正确的JRE文件吗?

主机JDK:Windows Oracle JDK 11.0.10x64

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 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文件。

共有1个答案

龚睿
2023-03-14

发现问题:问题出在我对Linux和MacOS JDK发行版的jmods目录的引用上。

对于Linux版本,我错误地将构建设置为下载版本11.0.1而不是11.0.2,这最终导致逻辑将层次结构扁平化而不是扁平化。这意味着build/jres/linux/jmods引用不针对任何现有文件夹,这意味着jlink在那里找不到JDK模块,因此包含了主机文件。

MacOS JDK有一个完全不同的文件结构,所以扁平化逻辑是错误的。最终,这会导致相同的jmods文件夹缺失症状。

在解决了这两个问题之后,jlink工具现在可以在构建跨平台运行时映像时正确地打包目标JDK文件。

 类似资料:
  • 由来 编码中我们常常需要调试输出一些信息,除了打印日志,最长用的要数System.out和System.err 比如我们打印一个Hello World,可以这样写: System.out.println("Hello World"); 但是面对纷杂的打印需求,System.out.println无法满足,比如: 不支持参数,对象打印需要拼接字符串 不能直接打印数组,需要手动调用Arrays.to

  • 我已经生成了智能合约封装包,但是智能合约的二进制文件是空的? 如果在Solidity中定义了一个接口,但其中一个方法的实现与原始接口定义不匹配,则生成的二进制文件将是空白的。 在下面的例子中: contract Web3jToken is ERC20Basic, Ownable { ... function transfer(address _from, address _to,

  • 本安装说明是提供给那些想在多种环境中安装 Docker 的 hacker 们的。 在进行安装之前,请检查你的 Linux 发行版本是否有打包好的 Docker 安装包。我们已经发布了许多发行版包,这样会节省您很多时间。 检查运行时的依赖关系 如果想要 Docker 正常运行,需要安装以下软件: iptables version 1.4 or later Git version 1.7 or lat

  • 我正在遵循中提到的步骤http://hyperledger-fabric.readthedocs.io/en/release-1.1/samples.html#binaries 我已经安装了所有的必备组件,但当我尝试执行给定的curl命令时,我不断收到以下错误: $curl-sSLhttps://github.com/hyperledger/fabric/blob/master/scripts/b

  • 所有下载均包括 SQLite, MySQL 和 PostgreSQL 的支持,同时所有资源均已嵌入到可执行程序中,这一点和老版本有所不同。 基于二进制的安装非常简单,只要从 下载页面 选择对应平台,拷贝下载URL,执行以下命令即可(以Linux为例): wget -O gitea https://dl.gitea.io/gitea/1.13.3/gitea-1.13.3-linux-amd64 c

  • 问题内容: 我用Java编写了AWS Lambda函数。我用来上传Lambda 的工具(Terraform)想要使用jar文件的SHA-256哈希值来跟踪是否需要上传新版本的Lambda。 问题在于,不同OS平台(Windows和Linux)上的不同JDK创建的字节码略有不同(即使使用相同的JDK“更新”版本)。这意味着,如果我在Windows上上传了一个lambda,然后在Linux上重新运行了