jpackage 把 Java 应用连同裁剪的运行时打成系统原生的应用包。生成的 .app 里有什么?配置怎么改?体积怎么压?签名到什么程度?这篇在 macOS 上真实打包、运行并逐项检查。
jpackage 返回码 0,耗时 3.7 s;
Demo.app 目录大小 155 MB
Demo.app 内的结构(两层):
Contents/
Info.plist (1 KB)
MacOS/
Demo (176 KB)
PkgInfo (0 KB)
Resources/
Demo.icns (369 KB)
_CodeSignature/
CodeResources (50 KB)
app/
.jpackage.xml (0 KB)
Demo.cfg (0 KB)
demo.jar (1 KB)
runtime/
Contents/
Demo.cfg 的内容:
[Application]
app.classpath=$APPDIR/demo.jar
app.mainclass=demo.Main
[JavaOptions]
java-options=-Djpackage.app-version=1.2.3
java-options=-Xmx64m
java-options=-Dcustom.prop=hello
[ArgOptions]
arguments=first
arguments=second
Info.plist 的主要键: {'CFBundleName': 'Demo', 'CFBundleIdentifier': 'demo', 'CFBundleVersion': '1.2.3', 'CFBundleExecutable': 'Demo', 'LSMinimumSystemVersion': '10.11', 'NSHighResolutionCapable': 'true'}
自动生成的运行时(jpackage 内部用 jlink 裁剪):release 文件里的 MODULES 有 63 个:['java.base', 'java.compiler', 'java.datatransfer', 'java.xml', 'java.prefs', 'java.desktop', 'java.instrument', 'java.logging', 'java.management', 'java.security.sasl', 'java.naming', 'java.rmi', 'java.management.rmi', 'java.net.http', 'java.scripting', 'java.security.jgss', 'java.smartcardio', 'java.transaction.xa', 'java.sql', 'java.sql.rowset', 'java.xml.crypto', 'jdk.accessibility', 'jdk.internal.jvmstat', 'jdk.attach', 'jdk.charsets', 'jdk.internal.opt', 'jdk.zipfs', 'jdk.compiler', 'jdk.crypto.ec', 'jdk.crypto.cryptoki', 'jdk.dynalink', 'jdk.internal.ed', 'jdk.editpad', 'jdk.httpserver', 'jdk.incubator.vector', 'jdk.internal.le', 'jdk.jartool', 'jdk.javadoc', 'jdk.management', 'jdk.management.agent', 'jdk.jconsole', 'jdk.jdeps', 'jdk.jdwp.agent', 'jdk.jdi', 'jdk.jfr', 'jdk.jlink', 'jdk.jpackage', 'jdk.jshell', 'jdk.jsobject', 'jdk.jstatd', 'jdk.localedata', 'jdk.management.jfr', 'jdk.naming.dns', 'jdk.naming.rmi', 'jdk.net', 'jdk.nio.mapmode', 'jdk.random', 'jdk.sctp', 'jdk.security.auth', 'jdk.security.jgss', 'jdk.unsupported', 'jdk.unsupported.desktop', 'jdk.xml.dom']
运行时里没有 bin/java 可执行文件: True ;有 lib/modules: True (120 MB)
--add-modules java.base:jpackage 返回码 0,Demo.app 43 MB,运行时模块 1 个
--add-modules java.base + --jlink-options "--strip-debug --compress zip-9":jpackage 返回码 0,Demo.app 30 MB,运行时模块 1 个 Contents/MacOS/Demo(不带参数):
args = [first, second]
java.home = <实验目录>
user.dir = /
app.path = <实验目录>
custom.prop = hello
max heap = 64 MB
ProcessHandle command = <实验目录>
带命令行参数 extra1 extra2:
args = [extra1, extra2]
改 Demo.cfg 里的 -Xmx64m 为 -Xmx256m 后: ['max heap = 256 MB']
环境变量 JAVA_TOOL_OPTIONS 对启动器的影响: ['Picked up JAVA_TOOL_OPTIONS: -Dfrom.env=1']
启动到退出的时间(中位,去掉前 2 次):app-image 启动器 64 ms;直接 java -cp demo.jar 38 ms(完整 JDK,有 CDS)codesign -dv: ['Identifier=demo', 'CodeDirectory v=20400 size=541 flags=0x2(adhoc) hashes=11+3 location=embedded', 'Signature=adhoc', 'TeamIdentifier=not set'] codesign --verify --deep:返回码 0 (无输出,验证通过) --type dmg:返回码 0,耗时 132 s,生成 Demo-1.2.3.dmg 58 MB --type pkg:返回码 0,耗时 8 s,生成 Demo-1.2.3.pkg 52 MB --main-jar 写错(文件不存在)→ 返回码 1 ; Advice to fix: The main jar must be specified relative to the input directory (not an absolute path), and must exist within that directory --main-class 写错 → jpackage 返回码 0 ;运行启动器: 返回码 1 ; Error: Could not find or load main class demo.NoSuchMain