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文件,因此也可以通过编写代码来进行打包操作:
导包:
compile files('D:/data/packr-all-4.0.0.jar')
<dependency>
<groupId>com.badlogicgames.packr</groupId>
<artifactId>packr</artifactId>
<version>1.2</version>
</dependency>
implementation group: 'com.badlogicgames.packr', name: 'packr', version: '1.2'
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 | 显示命令行界面帮助 |
除非您坚持使用 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 文件。
Packr 还可以从项目 jar 文件中删除所有与目标平台不匹配的动态库: