打包工具 Packr

Packr 是一款将jar包,资源文件和一个 JVM 打包为 Windows、Liunx 和 Mac OSX 上可运行的二进制文件的一款工具。其 Github 地址为https://github.com/libgdx/packr

对于游戏来说,Packr 版本为2.4.2+版本已经很好的支持了 java14 和 ZGC 垃圾回收方式。当构建 Java 14+ 的时候,需要使用 --useZgcIfSupportedOs 而不是使用 --vmargs XX:+UseZGC,因为在Windows 10 1803之前是不支持 ZGC 的。

在 jdk14 之后, JDK 中添加了一个新的工具 jpackage, 改工具和 Packr 功能差不多,因此也可以使用 jpackage 来打包。

下载

最新的版本可点击这里下载, 也可以在maven仓库下载:

使用

在使用 Packr 进行打包为可执行文件之前,需要先打包为为jar文件,然后可以通过 java -jar xxx.jar 来运行,libgdx游戏打包为可通过 jar -jar 来运行的方式可以阅读该篇文章

比如,当得到了一可 desktop-1.0.jar 文件,改文件可通过 jar -jar 命令运行起来,将其复制和 packr-all-4.0.0.jar同一个目录。

下一步需要一个 jdk, 可以点击这里下载对应平台、版本的 jdk, 这里我下载的是 OpenJDK8U-jdk_x64_windows_hotspot_8u322b06.zip,然后将其放到 D:\data 目录下。

终端执行打包

可以在终端执行:

java -jar packr-all-4.0.0.jar \
     --platform windows64 \
     --jdk D:/data/OpenJDK8U-jdk_x64_windows_hotspot_8u322b06.zip \
     --executable blockApp \
     --classpath D:/data/desktop-1.0.jar \
     --mainclass com.block.game.desktop.BlockDesktopLauncher \
     --vmargs Xms128m Xmx512m \
		 --minimizejre  soft \
     --output D:/data/out-windows64

或者在其目录新建一个 packer-config-win.json 配置文件,然后在执行:

java -jar packr-all-4.0.0.jar packer-config-win.json

packer-config-win.json文件内容如下:

{
    "platform": "windows64",
    "jdk": "D:/data/OpenJDK8U-jdk_x64_windows_hotspot_8u322b06.zip",
    "executable": "blockApp",
    "classpath": [
        "D:/data/desktop-1.0.jar"
    ],
    "mainclass": "com.block.game.desktop.BlockDesktopLauncher",
    "vmargs": [
       "Xms128m","Xmx512m"
    ],
    "minimizejre": "soft",
    "output": "D:/data/out-windows64"
}

代码执行打包

packr-all-4.0.0.jar 本身就是一个jar文件,因此也可以通过编写代码来进行打包操作:

导包:

  1. 直接把 packr-all-4.0.0.jar 导入项目, 推荐这种,比如 gradle 实例:
compile files('D:/data/packr-all-4.0.0.jar')
  1. maven(不推荐,版本有点老了)
<dependency>
    <groupId>com.badlogicgames.packr</groupId>
    <artifactId>packr</artifactId>
    <version>1.2</version>
</dependency>
  1. gradle(不推荐,版本有点老了)
implementation group: 'com.badlogicgames.packr', name: 'packr', version: '1.2'
  1. 官方发布的仓库 (也不推荐,估计有网络原因,不好下载下来) 如果直接使用中央仓库的话目前在本文编写的这个时间点上好像已经不更新了,因此可以使用 https://artifactory.nimblygames.com/ 仓库,这里貌似可以使用到最新的版本,比如 Gradle 中使用:
repositories {
   mavenCentral() 
   maven(uri("https://oss.sonatype.org/content/repositories/snapshots/")) 
   maven(uri("http://artifactory.nimblygames.com/artifactory/ng-public-snapshot/"))
   maven(uri("http://artifactory.nimblygames.com/artifactory/ng-public-release/"))
}
dependencies {
   implementation("com.badlogicgames.packr:packr:4.0.0")
}

打包代码如下:

    PackrConfig config = new PackrConfig();
		config.platform = PackrConfig.Platform.Windows64;
		config.jdk = "D:/data/OpenJDK8U-jdk_x64_windows_hotspot_8u322b06.zip";
		config.executable = "blockApp";
		config.classpath = Arrays.asList("D:/data/desktop-1.0.jar");
		config.mainClass = "com.block.game.desktop.BlockDesktopLauncher";
		config.vmArgs = Arrays.asList("Xms128m","Xmx512m");
		config.minimizeJre = "soft";
		File outDir = new File("D:/data/out-windows64");
		config.outDir = outDir;

		new Packr().pack(config);

参数说明

参数 说明
platform windows64, linux64 或者 mac
jdk JDK/JRE的目录、下载 URL 地址以及 zip 或者 tar.gz 的压缩文件, Adopt OpenJDK 可以点击 这里 下载, 如果未指定,则使用 ${java.home} 的值
executable 可执行文件的名字,不带后缀,比如 .exe
jrePath(可选) jre的路径。默认情况下,JRE 将放在一个名为 jre 的文件夹中。
classpath 需要打包的 jar 文件,数组
removelibs (可选) 用于删除与本机不匹配的jar文件,比如一些平台类jar文件.
mainclass 启动类
vmargs (可选) JVM参数,数组
resources (可选) 资源
minimizejre (可选) 只在 java8 或更低版本的 jdk 上使用。通过删除附加配置文件所指定的目录和文件来最小化 JRE。带有一些现成的配置文件。有关最小化配置文件的详细信息,请参阅下面的内容。
output 输出目录。这必须是一个空目录或不存在的路径。
cachejre (可选) 一个可选目录,用于缓存 JRE 提取和最小化的结果。请参阅下面的内容。
icon(可选,对于OSX) AppBundle 图标资源(. icns 文件)的位置
bundle (可选, OS X) 应用程序的捆绑标识符,例如“ com.my.app”
verbose (可选) 在处理过程中打印更多的状态信息,这对调试很有用
help 显示命令行界面帮助

最小化 JRE

除非您坚持使用 java8,否则最好使用 jlink 创建一个最小化的 JRE。

一个标准的 OpenJDK8 JRE 大约是 91 MiB 的大小。因此需要对其进行裁剪是最好的。为了最小化与应用绑定的 JRE,你必须通过你提供给 Packr 的 minimizejre 参数指定一个最小化配置文件。最小化配置是一个 JSON 文件,其中包含要删除的 JRE 中的文件和目录的路径。

{
  "reduce": [
    {
      "archive": "jre/lib/rt.jar",
      "paths": [
        "com/sun/corba",
        "com/sun/jndi",
        "com/sun/media",
        "com/sun/naming",
        "com/sun/rowset",
        "sun/applet",
        "sun/corba",
        "sun/management"
      ]
    }
  ],
  "remove": [
    {
      "platform": "*",
      "paths": [
        "jre/lib/rhino.jar"
      ]
    },
    {
      "platform": "windows",
      "paths": [
        "jre/bin/*.exe",
        "jre/bin/client"
      ]
    }
  ]
}

该配置将解压 rt.jar,删除 com.sun.、 sun. 中的所有包和类,然后重新打rt.jar 。默认情况下,JRE 对其 JAR 文件使用零压缩来使应用程序启动更快一些,因此这一步将大大减少 rt.jar 的大小。

Packr 提供了两种不同的配置: sort 和 hard。hard配置将删除其配置的文件,并重新打包了一些额外的 jar 文件。

removelibs

Packr 还可以从项目 jar 文件中删除所有与目标平台不匹配的动态库:

  • Windows: *.dylib, *.so
  • Linux: *.dll, *.dylib
  • MacOS: *.dll, *.so