問題
Mac OS Xアプリケーションバンドルは、OracleのJava7パッケージと互換性のないアプリバンドラーで作成されています。使用していたバンドラーは、たとえば、Jar Bundler
AppleのJava6システムパッケージでのみ機能するAppleから提供されたものである可能性があります。
Appleは、Java7以降の統合システムパッケージとしてのJavaのサポートを断念しました。結果として、OracleJava7サードパーティパッケージとそのアプリケーションパッケージバンドルソリューションを選択する必要があります。これにより、Mac OSX10.7.3以降でOracleJava7ベースのアプリケーションバンドルを作成してデプロイできます。
あなたが直面している根本的な技術的問題は、AppleのネイティブObjective-C
ベースのJavaAppLauncher
バイナリであり、それが使用するフォーマットInfo.plist
はAppleのJava 6システムパッケージでJavaAppLauncher
Info.plist
のみ機能し、Oracleからの組み合わせはOracleのJava7パッケージでのみ機能します。
JavaAppLauncher
サポートしているAppleのJava6システムパッケージを 使用しているため、MacにインストールされているAppleJava6システムパッケージを常に取得します。
OracleのJavaプラットフォームのMacOSXポートのリードエンジニアであるScottKovatchが、OracleJava7のアプリバンドルがどのように機能しているかについてDEVOXXについて詳細に話しているビデオがあります。
解決
Mac OSX10.7.3以降に基づくアプリバンドルを作成するには
以上では、Oracleのアプリバンドラーを使用する必要があります
Oracleのアプリバンドラーを使用すると、MacにデフォルトのOracleJava7パッケージがインストールされた状態でパッケージ化されたアプリを実行することができます。
/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/
または、パッケージ化されたアプリケーションにインライン化するOracle Java 7 JRE
MyJavaMacOSXApp.app/Contents/PlugIns/
注:両方のアプローチには長所と短所がありますが、バンドルされたアプリを使用してApple App Storeにアクセスする場合は、独自のJREを使用した最後のアプローチが必要です。
何をする必要があるか
- ダウンロード
appbundler-1.0.jar
して移動します<project>/lib/appbundler-1.0.jar
以下を追加してください<project>/build.xml
<property environment="env" />
<taskdef
name="bundleapp"
classname="com.oracle.appbundler.AppBundlerTask"
classpath="lib/appbundler-1.0.jar" />
<target name="bundle">
<bundleapp
outputdirectory="dist"
name="MyJavaMacOSXApp"
displayname="My Java Mac OS X App"
identifier="com.example.MyJavaMacOSXApp"
shortversion="1.0"
applicationCategory="public.app-category.developer-tools"
mainclassname="com.example.MyJavaMacOSXApp">
<runtime dir="${env.JAVA_HOME}" />
<classpath file="dist/MyJavaMacOSXApp.jar" />
</bundleapp>
</target>
MyJavaMacOSXApp
注:アプリケーションデータに置き換える必要があります。この例は、最も単純な形式でどのように機能するかのみを示しているため、ここでいくつかの追加オプションを見つけることができます。AppBundlerTask
bundle
でターゲットを実行すると、ディレクトリに表示されant bundle
ます。MyJavaMacOSXApp.app
<project>/dist
<runtime dir="${env.JAVA_HOME}" />
要素は何ですか?
Oracle Java 7パッケージ(JRE)のインライン化
上記のAntターゲットは、Oracle Java 7 Package(JRE)を
の中へ
MyJavaMacOSXApp.app/Contents/PlugIns
したがって、アプリケーションパッケージは完全に自己完結型であり、ターゲットシステムにOracle Java 7 Package(JRE)をインストールする必要はまったくありません。あなたがそのような展開された次のスクリーンショットで見ることができるようにMyJavaMacOSXApp.app
:

デフォルトのOracleJava7 Package(JRE)の配線
アプリケーションバンドルターゲットMacにインストールされているデフォルトのOracleJava7 Package(JRE)を使用する場合
/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/
あなたは削除する必要があります
<runtime dir="${env.JAVA_HOME}" />
タスクからの要素bundle
。あなたがそのような展開された次のスクリーンショットで見ることができるようにMyJavaMacOSXApp.app
:

ソースMyJavaMacOSXApp.java
package com.example;
import java.awt.*;
import javax.swing.*;
public class MyJavaMacOSXApp extends JPanel {
public MyJavaMacOSXApp() {
JLabel versionLabel = new JLabel("java.version=" + System.getProperty("java.version"));
JLabel homeLabel = new JLabel("java.home=" + System.getProperty("java.home"));
setLayout(new BorderLayout());
add(versionLabel, BorderLayout.PAGE_START);
add(homeLabel, BorderLayout.PAGE_END);
}
private static void createAndShowGUI() {
JFrame frame = new JFrame("MyJavaMacOSXApp");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
MyJavaMacOSXApp newContentPane = new MyJavaMacOSXApp();
newContentPane.setOpaque(true);
frame.setContentPane(newContentPane);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
アプリに複数のjarファイルがある場合はどうなりますか?
<classpath file="dist/additional.jar" />
必要な数のエントリを追加するだけです。
注:バンドルタスクの要素の順序は、バンドルされたアプリの実行時に保持されません。は、ディレクトリからsを読み取るときにjava.class.path
、ネイティブによって実行時に構築されます。JavaAppLauncher
*.jar
MyJavaMacOSXApp.app/Contents/Java
完全を期すために、これはInfo.plist
次のようになります。
<?xml version="1.0" ?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleExecutable</key>
<string>JavaAppLauncher</string>
<key>CFBundleIconFile</key>
<string>GenericApp.icns</string>
<key>CFBundleIdentifier</key>
<string>com.example.MyJavaMacOSXApp</string>
<key>CFBundleDisplayName</key>
<string>My Java Mac OS X App</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>MyJavaMacOSXApp</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>NSHumanReadableCopyright</key>
<string></string>
<key>LSApplicationCategoryType</key>
<string>public.app-category.developer-tools</string>
<key>JVMRuntime</key>
<string>jdk1.7.0_17.jdk</string>
<key>JVMMainClassName</key>
<string>com.example.MyJavaMacOSXApp</string>
<key>JVMOptions</key>
<array>
</array>
<key>JVMArguments</key>
<array>
</array>
</dict>
</plist>
この回答の基になっている重要なドキュメント:
- http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/packagingAppsForMac.html
- http://java.net/projects/appbundler/pages/Home
- http://java.net/downloads/appbundler/appbundler.html
- http://intransitione.com/blog/take-java-to-app-store/
- http://www.parleys.com/#st=5&id=2891&sl=37
さらに多くの機能とバグ修正を備えた、手入れの行き届いたappundler自体のフォークもあります。