我试图构建一个应用程序的跨平台归档,该应用程序使用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文件。
发现问题:问题出在我对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上重新运行了