求助:使用Javapackager构建的Java9 Mac应用无法启动
问题场景
用Ant的fx:deploy任务或直接调用javapackager命令构建MacOS原生Java9应用包时,构建过程无报错,但双击生成的.app文件无法启动,抛出如下错误:
The application cannot be opened for an unexpected reason, error=Error Domain=NSOSStatusErrorDomain Code=-10810 "kLSUnknownErr: Unexpected internal error" UserInfo={_LSFunction=_LSLaunchWithRunningboard, _LSLine=2732, NSUnderlyingError=0x600003f40630 {Error Domain=RBSRequestErrorDomain Code=5 "Launch failed." UserInfo={NSLocalizedFailureReason=Launch failed., NSUnderlyingError=0x600003f404b0 {Error Domain=NSPOSIXErrorDomain Code=21 "Is a directory" UserInfo={NSLocalizedDescription=Launchd job spawn failed}}}}}
但直接进入.app包内的Contents/MacOS目录,运行里面的可执行文件却能正常启动应用。
错误原因
底层错误Code=21 "Is a directory"明确说明:launchd尝试启动的路径指向了一个目录,而非实际的可执行文件。这大概率是应用包的Info.plist配置文件中,CFBundleExecutable字段的值错误,指向了目录而非正确的可执行文件名。
解决步骤
手动检查并修复Info.plist
- 右键.app文件,选择「显示包内容」,打开
Contents/Info.plist - 找到
CFBundleExecutable字段,确认其值是否为Contents/MacOS目录下实际的可执行文件名 - 如果值错误,直接修改为正确的可执行文件名(通常和.app包名称一致)
- 右键.app文件,选择「显示包内容」,打开
统一构建参数,避免路径冲突
- 对于Ant的
fx:deploy任务:确保outfile、fx:application的name、fx:info的name参数保持一致,避免生成的可执行文件和目录名冲突:<fx:deploy width="300" height="250" nativeBundles="image" outdir="Platforms/Macintosh/dist" mainClass="<classname>" outfile="<applicationname>" <fx:application refId="<appid>" name="<applicationname>"/> <fx:resources refid="<resources>"/> <fx:info title="<appname>" vendor="<myname>" name="<applicationname>"/> </fx:deploy> - 对于
javapackager命令行:确保-outfile、-name参数统一,避免生成的可执行文件路径被错误识别为目录:javapackager -deploy -native image -outdir Platforms/Macintosh/dist -outfile appname -srcdir Platforms/Java/dist -srcfiles jarfilename -appclass classname -name "appname" -title "appname demo" -nosign
- 对于Ant的
清理残留后重新构建
- 删除
Platforms/Macintosh/dist目录下的所有旧构建产物 - 重新执行Ant任务或
javapackager命令,避免残留文件导致的路径识别错误
- 删除
强制指定可执行文件名称(Java9兼容性修复)
Java9的javapackager在MacOS上存在路径解析的已知bug,可通过添加参数强制指定可执行文件名称:- 命令行添加
-Bmac.CFBundleExecutable=appname:javapackager -deploy -native image -outdir Platforms/Macintosh/dist -outfile appname -srcdir Platforms/Java/dist -srcfiles jarfilename -appclass classname -name "appname" -title "appname demo" -nosign -Bmac.CFBundleExecutable=appname - Ant任务添加
mac.CFBundleExecutable="<applicationname>"属性:<fx:deploy width="300" height="250" nativeBundles="image" outdir="Platforms/Macintosh/dist" mainClass="<classname>" outfile="<applicationname>" mac.CFBundleExecutable="<applicationname>" <fx:application refId="<appid>"/> <fx:resources refid="<resources>"/> <fx:info title="<appname>" vendor="<myname>"/> </fx:deploy>
- 命令行添加
内容的提问来源于stack exchange,提问作者dbp

