web-dev-qa-db-ja.com

アプリケーションはJava 6からAppleの代わりにJava 7からOracleでMac OS X?

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

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

Java_HOMEも適切に設定されています。

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

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

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

  • OS Xバージョン

    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は間違った何かを指していると思います。

35
amod

問題

Mac OS Xアプリケーションバンドルは、OracleのJava 7パッケージと互換性のないアプリバンドラーで作成されています。たとえば、Appleが提供するJar Bundlerは、AppleのJava 6システムパッケージでのみ機能します。

Appleは、Java 7以降の統合システムパッケージとしてJavaのサポートを断念しました。そのため、Oracle Java 7サードパーティパッケージとそのアプリケーションパッケージバンドルソリューションを選択する必要があります。これにより、Mac OS X 10.7.3以降でOracle Java 7ベースのアプリケーションバンドルを作成およびデプロイできます。

あなたが直面している根本的な技術的問題は、AppleのネイティブObjective-CベースのJavaAppLauncherバイナリであり、Info.plistで使用する形式はAppleのJava 6システムパッケージとOracleからのJavaAppLauncherInfo.plistの組み合わせは、OracleのJava 7パッケージに対してのみ機能します。

AppleのJava 6システムパッケージをサポートするJavaAppLauncherを使用しているため、常にApple Java 6システムパッケージがインストールされます。マック。

ビデオ があります。OracleのJavaプラットフォームのMac OS XポートのリードエンジニアであるScott Kovatchは、OracleのアプリバンドルについてJava 7は非常に詳細に機能しています。

溶液

Mac OS X 10.7.3以降に基づいてアプリバンドルを作成するには

以上では、Oracleのアプリバンドラーを使用する必要があります

Oracleのアプリバンドラーを使用すると、MacにインストールされているデフォルトのOracle Java 7パッケージを使用して、パッケージ化されたアプリを実行できます。

  • /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をアプリケーションデータに置き換える必要があります。 here いくつかの追加のAppBundlerTaskオプションを見つけることができます。この例では、最も単純な形式での動作方法のみを示しています。

  • ant bundlebundleターゲットを実行すると、MyJavaMacOSXApp.appディレクトリに<project>/distが見つかります。

<runtime dir="${env.Java_HOME}" />要素とは何ですか?

インライン化Oracle Java 7パッケージ(JRE)

上記のAntターゲットは、Oracle Java 7パッケージ(JRE)を

  • Java_HOME

  • MyJavaMacOSXApp.app/Contents/PlugIns

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

MyJavaMacOSXApp Inline JRE

デフォルトのOracle Java 7パッケージ(JRE)の配線

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

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

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

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

bundleタスクの要素。このようなデプロイされたMyJavaMacOSXApp.appの次のスクリーンショットで見ることができるように:

MyJavaMacOSXApp Inline 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" />エントリを追加してください。

注:バンドルタスクの要素の順序は、バンドルされたアプリの実行時に保持されません。 Java.class.pathは、*.jarディレクトリからMyJavaMacOSXApp.app/Contents/Javasを読み取るときに、ネイティブのJavaAppLauncherによって実行時に構築されます。


完全を期すために、これは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

また、多くの機能とバグ修正を備えた、よく管理されたappbundlerのフォークもあります。

90
Uwe Günther

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

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

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

4
Armand

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

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

上記のすべての手順を完了した後、次の出力を再度作成してください。

  1. どのOS Xバージョンを使用しますか?
  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 でる?

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

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

4
Uwe Günther

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

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

InteliJは正常に動作しますが、私はまだJava SE 7などのNetBeansを使用しています。

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)
1
candylady

編集:Uweの印象的な答えは、AppLauncherを使用していたことが判明したOPにとって絶対に正しいです。私の最初の質問は、OSXでのコマンドラインの問題に関連するもので、Java 6 vs Java 7. Thecomments元の質問では、私は間違っていましたが、コマンドラインの問題がある人は誰でも、以下の方が簡単な解決策を見つけるかもしれません。

元:私の状況は、OPが持っていたと思ったのと同じように見えました:Java 1.7コマンドラインでは完全に1.7ですが、mvnは失敗し、1.6について文句を言いました。 sbtとIntelliJを使用して、サードパーティのプロジェクトを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はうまく機能しました。

1
Andrew E