0

Java アプリケーションを Mac OS X .app バンドルにバンドルしようとしています。私は現在appbundlerを使用しており、 Oracle のガイドに従いました。Ant タスクは Netbeans で正常に動作し、対応する .app パッケージは (Windows 上で) 正しくビルドされます。しかし、MacBookPro (OS X 10.7.5) に対して .app パッケージを実行しようとすると、ログに次のエラーが表示されます。

[0x0-0x72072].ch.lawsuite.core.Servitus: Error: Unable to access jarfile LawSuiteSE.jar

.jar ファイルのアクセス許可を既に確認しており、実行ビットは main-jar と lib-folder 内のすべての 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 ファイル内のクラスパス プロパティによって適切にリンクされています。appbundle-ant-task 内でこれらのライブラリをコピーする必要がありますか、それとも後で手動でコピーしても問題ありませんか?

また、アプリケーションと対応する .app パッケージを MacBook Pro でビルドしようとしましたが、同じエラー メッセージが表示されました。

これが私のAntタスクです:

<!-- 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>

編集: その間、Contents/MacOS の JavaAppLauncher を小さな実行スクリプト (start.sh) に置き換えました。

#!/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」のような現在の app-folder を指す定数はありますか。

#!/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 は無視されます)。また、mainclassname ではスラッシュの代わりにドットを使用する必要があります。

<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して、バンドルの へのパスを取得し、Contents/MacOSそこから相対パスを取得できます。おそらく、PATH に依存するのではなく、公開 JRE への明示的な参照を作成する必要がありjavaます。これは、ターゲット マシンにJREしかない場合ではなく、 JDKがインストールされている場合にのみ機能するためです。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 に答える