jar_pack

一个基于 Golang embed 打包自定义的 jre 和 jar 文件的跨平台打包工具,方便打包 jar 程序进行二进制分发。

使用示例(Java 8 版本环境打包到 Linux x86 下运行)

  • 步骤 1: 准备指定版本以及系统的 JRE (可以从 Azul 下载。),并解压到/jre 目录下。
  • 步骤 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 文件即可运行。

剪裁 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...