35

現在のアプリケーションを、OracleのJava7がインストールされているMacOSXでテストしています。OracleのJava7を使用する代わりに、AppleのJava6を使用しています。のデフォルトのシステム出力java -versionはを示してい7ます。

さまざまなサイトで言及されていることのほとんどを試しましたが、この問題を修正できませんでした。

JAVA_HOMEまた、適切に設定されています。

私はテスト目的でのみMacを使用しています。私はこれについて本当にいくつかのガイダンスが必要です。

JRE 7を選択してEclipseで実行すると、正しく実行されます。したがって、アプリケーションに問題はありません。MacOSXで何かが足りません。

私のJavaシステム環境は次のようになります。

  • OSXバージョン

    10.8

  • /usr/libexec/java_home -V

    Matching Java Virtual Machines (3):
    1.7.0_12, x86_64: "Java SE 7" /Library/Java/JavaVirtualMachines/jdk1.7.0_12.jdk   
    1.6.0_37-b06-434, x86_64: "Java SE 6" /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
    1.6.0_37-b06-434, i386: "Java SE 6" /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
    
    /Library/Java/JavaVirtualMachines/jdk1.7.0_12.jdk/Contents/Home
    
  • /usr/libexec/java_home

    /Library/Java/JavaVirtualMachines/jdk1.7.0_12.jdk/Contents/Home
    
  • echo $JAVA_HOME

    /Library/Java/JavaVirtualMachines/jdk1.7.0_12.jdk/Contents/Home/
    
  • JAVA_ARCH設定されていません

  • /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java -version

    java version "1.7.0_12-ea"
    
  • ls /Library/Java/JavaVirtualMachines

    jdk1.7.0_12.jdk
    
  • /System/Library/Frameworks/JavaVM.framework/Commands/java -version

    java version "1.6.0_37"
    

私の現在のJDKは何か問題を指摘していると思います。

4

5 に答える 5

90

問題

Mac OS Xアプリケーションバンドルは、OracleのJava7パッケージと互換性のないアプリバンドラーで作成されています。使用していたバンドラーは、たとえば、Jar BundlerAppleの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)を

  • JAVA_HOME

の中へ

  • MyJavaMacOSXApp.app/Contents/PlugIns

したがって、アプリケーションパッケージは完全に自己完結型であり、ターゲットシステムにOracle Java 7 Package(JRE)をインストールする必要はまったくありません。あなたがそのような展開された次のスクリーンショットで見ることができるようにMyJavaMacOSXApp.app

MyJavaMacOSXAppインラインJRE

デフォルトのOracleJava7 Package(JRE)の配線

アプリケーションバンドルターゲットMacにインストールされているデフォルトのOracleJava7 Package(JRE)を使用する場合

  • /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/

あなたは削除する必要があります

  • <runtime dir="${env.JAVA_HOME}" />

タスクからの要素bundle。あなたがそのような展開された次のスクリーンショットで見ることができるようにMyJavaMacOSXApp.app

MyJavaMacOSXAppインラインJRE

ソース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*.jarMyJavaMacOSXApp.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> 

この回答の基になっている重要なドキュメント:

  1. http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/packagingAppsForMac.html
  2. http://java.net/projects/appbundler/pages/Home
  3. http://java.net/downloads/appbundler/appbundler.html
  4. http://intransitione.com/blog/take-java-to-app-store/
  5. http://www.parleys.com/#st=5&id=2891&sl=37

さらに多くの機能とバグ修正を備えた、手入れの行き届いたappundler自体のフォークもあります。

于 2013-03-07T12:37:43.327 に答える
4

お使いのシステムは実際には最新ではありません。これがあなたの問題を引き起こしていると言っているのではありません。しかし、念のために、私は最新かつ最高の役割を果たします。

  1. Mac OS X 10.8.2を使用していることを確認し、システムアップデートを介してシステムを転送します。
  2. Apple、別名Java for OSX2013-002から新しいJRE1.6.0_43をインストールします
  3. Apple、別名Java for OSX2013-002開発者パッケージから新しいJDK1.6.0_43をインストールします。2013年3月4日。Apple JDKを入手するには、Apple ID(無料の開発者アカウント)を使用してここにログインし、「Java for OSX2013-002開発者パッケージ」という用語を検索する必要があります。残念ながら、そのパッケージへの直接リンクはありません。
  4. 古いOracleJDKを削除しますsudo rm -rf /Library/Java/JavaVirtualMachines/jdk1.7.0_12.jdk。注:次のステップで現在のOracle JDK 1.7.0_17をインストールするため、これは安全です。
  5. MacOSX用のOracleJDK1.7.0_17をダウンロードしてインストールします。注:これには、OracleのJRE1.7.0_17も含まれます。
  6. 再起動します。

上記のすべての手順を完了したら、次の出力をもう一度考えてください。

  1. どのOSXバージョンを使用していますか?
  2. コマンドをダンプするものは何/usr/libexec/java_home -Vですか?
  3. コマンドをダンプするものは何/usr/libexec/java_homeですか?
  4. コマンドをダンプするものは何echo $JAVA_HOMEですか?
  5. コマンドをダンプするものは何echo $JAVA_ARCHですか?
  6. コマンドをダンプするものは何/Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java -versionですか?
  7. コマンドをダンプするものは何ls /Library/Java/JavaVirtualMachinesですか?
  8. コマンドをダンプするものは何/System/Library/Frameworks/JavaVM.framework/Commands/java -versionですか?

元の質問で行った手順と作業を文書化するだけです。だからそれはあなたの進歩を反映しています。

更新:解決策は、Oracleを使用してMacOSXアプリケーションバンドルを作成することAppBundlerTaskです。詳細については、ここで私の他の答えを参照してください: https ://stackoverflow.com/a/15271448

于 2013-03-07T10:53:36.527 に答える
4

アプリが必要とする Java バージョンは、アプリケーションのメタデータで指定されている可能性があります。アプリを右クリックして [パッケージの内容を表示] を選択し、ファイルを参照するInfo.plistと、アプリケーションが使用する JVM を定義するエントリが見つかるはずです。例えば

    <key>JVMVersion</key>
    <string>1.5</string>

アプリケーションが要求した場合、OSX はより低い JVM の使用を選択する場合があります。

于 2013-02-11T06:14:32.620 に答える
1

編集:Uweの印象的な答えは、AppLauncherを使用していたことが判明したOPにとって絶対に正しいです。この質問を最初に読んだのは、Java 6 と Java 7 を使用した OSX のコマンドラインの問題に関連しているということでした。元の質問に対するコメントは、私が間違っていたことを示しています。ただし、コマンドラインの問題を抱えている人は、以下がより簡単な解決策であることに気付くかもしれません。

オリジナル:私の状況は、OPが持っていたと思っていたのと同じように見えました.Java 1.7はコマンドラインで完全に動作しましたが、mvn失敗して1.6について不平を言い、一般的なコンパイルはsbtIntelliJを使用して正常に機能していました。でサードパーティのプロジェクトをコンパイルする際に問題が発生しただけmvnです。

これはうまく機能し、はるかに簡単であることがわかりました。

http://www.jayway.com/2013/03/08/configuring-maven-to-use-java-7-on-mac-os-x/

そこから必要だったのは、次の .profile だけでした。

export JAVA_HOME=`/usr/libexec/java_home -v 1.7`

その変数を設定するとmvnうまくいきました。

于 2013-07-31T05:00:56.787 に答える
1

これをインストールしてみてください:

http://support.apple.com/kb/dl1572

InteliJ は問題なく動作しますが、私はまだ NetBeans などを使用して Java SE 7 を使用しています。

java -version
java version "1.7.0_51"
Java(TM) SE Runtime Environment (build 1.7.0_51-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)
于 2014-11-04T12:49:37.617 に答える