我正在尝试将我的 Java 应用程序捆绑到 Mac OS X .app 捆绑包中。我目前正在使用appbundle并遵循Oracle 的指南。Ant 任务在 Netbeans 中运行良好,并且正确构建了相应的 .app 包(在 Windows 上)。但是,当尝试将 .app 包执行到我的 MacBookPro(OS X 10.7.5)时,我在日志中收到以下错误:
[0x0-0x72072].ch.lawsuite.core.Servitus: Error: Unable to access jarfile LawSuiteSE.jar
我已经检查了 .jar 文件的权限,并且为 main-jar 和 lib 文件夹中的所有 jar 设置了执行位。
在终端输入以下内容时,应用程序运行良好:
java -jar /Applications/Servitus.app/Contents/Java/LawSuiteSE.jar --installer
为澄清起见,这是最终的文件夹结构:
Servitus.app
|_Contents
|_Java
|_LawSuiteSE.jar
|_lib
|_lib1.jar
|_lib2.jar
|_subfolder1
|_lib3.jar
|_subfolder2
|_lib4.jar
|_etc...
|_MacOS
|_JavaAppLauncher
|_PlugIns
|_Resources
|_en.lproj
|_Localizable.strings
|_kplus.icns
|_Info.plist
|_PkgInfo
顺便说一句,我的应用程序有很多外部依赖项,都位于“lib”文件夹中,这些依赖项由可执行 main-jar 文件“LawSuiteSE.jar”的 MANIFEST.MF 文件中的 class-path 属性正确链接。我是否需要在 appbundle-ant-task 中复制这些库,还是可以随后手动复制它们?
我还尝试在 MacBook Pro 上构建应用程序和相应的 .app 包,但出现相同的错误消息。
这是我的蚂蚁任务:
<!-- Define the appbundler task -->
<taskdef name="bundleapp" classname="com.oracle.appbundler.AppBundlerTask"/>
<!-- Create the app bundle -->
<target name="bundle-macosx">
<bundleapp outputdirectory="macosx"
name="Servitus"
displayname="Servitus"
identifier="ch.lawsuite.core.Servitus"
shortversion="1.0"
applicationCategory="public.app-category.business"
icon="src/ch/lawsuite/data/icons/gmbh/osx/kplus.icns"
mainclassname="ch.lawsuite.core.Servitus">
<classpath file="dist/LawSuiteSE.jar"/>
<argument value="--installer"/>
</bundleapp>
</target>
编辑:我同时用一个小的运行脚本(start.sh)替换了 Contents/MacOS 中的 JavaAppLauncher:
#!/bin/bash
java -Xms256m -XX:PermSize=128m -jar /Users/salocinx/Workspace/LawSuiteSE.app/Contents/Java/LawSuiteSE.jar --installer
然后,我还将Info.plist 中键CFBundleExecutable的值从JavaAppLauncher 替换为start.sh。
现在它工作正常,但我怎样才能使用 jar 可执行文件的相对路径?像“../Java/LawSuiteSE.jar”这样的东西不起作用,给我和以前一样的错误。是否有任何常量指向当前的应用程序文件夹,例如“$APP_ROOT”,以便脚本看起来像:
#!/bin/bash
java -Xms256m -XX:PermSize=128m -jar $APP_ROOT/Contents/Java/LawSuiteSE.jar --installer
有任何想法吗?