jar_pack
一个基于 Golang embed 打包自定义的 jre 和 jar 文件的跨平台打包工具,方便打包 jar 程序进行二进制分发。
使用示例(Java 8 版本环境打包到 Linux x86 下运行)
- 步骤 1: 准备指定版本以及系统的 JRE (可以从 Azul 下载。),并解压到/jre 目录下。
![](/resources/more/jar_pack/download_jre.webp)
- 步骤 2: 准备需要打包的 JAR(JAR 包要能独立运行 java -jar xxx.jar),重命名为 app.jar。
mv your-app.jar app.jar
- 步骤 3: 打包 Java 程序依赖的本地库,并解压到/lib 目录下。(可选)
mv xxx.dll lib/
mv xxx.so lib/
- 步骤 4: 编译
GOOS=linux GOARCH=amd64 go build -o app
运行
运行(./app),或者指定 jvm 参数运行(./app --spring.config.location=./application.yml)
Windows 系统特殊说明
为了在 Windows 平台上指定应用程序的图标,可以使用 rsrc 工具将图标嵌入到可执行文件中。
- 查找 ico 图标
图标保存到程序同级目录 favicon.ico
- 新建程序描述文件 app.manifest ,写入以下初始内容
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
<assemblyIdentity version="1.0.0.0" processorArchitecture="*" name="SomeFunkyNameHere" type="win32"/>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"/>
</dependentAssembly>
</dependency>
<asmv3:application>
<asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
<dpiAware>true</dpiAware>
</asmv3:windowsSettings>
</asmv3:application>
</assembly>
- 生成资源嵌入文件 rsrc.syso
rsrc -manifest app.manifest -o rsrc.syso -ico favicon.ico
- 在 Windows 系统下,可以通过在编译时加入参数 -ldflags="-H windowsgui" 来隐藏黑窗口。
go build -ldflags "-s -w -H=windowsgui"
- 双击 exe 文件即可运行。
![](/resources/more/jar_pack/jcef_browser.webp)
剪裁 JRE
Java 9 引入的一项功能,用于创建自定义的 JRE。这个自定义 JRE 只包含应用程序运行所需的模块,从而减少了体积
- 分析依赖
首先,使用 jdeps 工具来分析你的 JAR 文件,确定需要的模块。假设你的应用程序 JAR 文件名为 app.jar,你可以运行以下命令:
jdeps --list-deps app.jar
- 创建自定义 JRE:
根据 jdeps 的输出,使用 jlink 创建自定义 JRE。例如,假设你的应用程序需要以下模块:
java.base java.logging
jlink --module-path $JAVA_HOME/jmods --add-modules java.base,java.logging --output custom-jre
运行原理
$JAVAW||$JAVA -Djava.library.path=$LIB -jar $JAR $ARGS...