0

我正在尝试将我的 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

有任何想法吗?

4

1 回答 1

3

我需要在 appbundle-ant-task 中复制这些库吗

classpath是的,您应该在元素中提及所有必需的库。然后,捆绑器会将它们全部复制到捆绑包内的适当位置(当捆绑包运行时,只有直接位于其下的 JAR 文件Contents/Java才会进入类路径,子目录中的 JAR 将被忽略)。您还应该在主类名中使用点而不是斜线。

<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"/>
    <classpath dir="lib" includes="*.jar" />
    <argument value="--installer"/>
</bundleapp>

编辑

现在它工作正常,但我怎样才能使用 jar 可执行文件的相对路径

您可以使用dirname $0获取您的 bundle 的路径Contents/MacOS,并从那里获取相对路径。您可能还应该明确引用公共 JRE 而不是依赖于java您的 PATH,因为这仅在目标计算机安装了JDK时才有效,而不是在它只有JRE时才有效。安装 JDK 也会安装公共 JRE,所以在这种情况下也是安全的。

#!/bin/bash

SCRIPT_DIR="`dirname $0`"
exec "/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java" \
  -Xms256m -XX:PermSize=128m -jar "$SCRIPT_DIR/../Java/LawSuiteSE.jar" --installer
于 2014-08-14T15:34:07.283 回答