Приложение использует Java 6 от Apple вместо Java 7 от Oracle на Mac OS X?

Я тестирую свое текущее приложение с Mac OS X, на котором установлена ​​Java 7 от Oracle. Вместо этого, используя Java 7 от Oracle, он использует Java 6 от Apple. Системный вывод по умолчанию java -version показывает 7,

Я пробовал большинство вещей, упомянутых на разных сайтах, но мне не удалось решить эту проблему.

JAVA_HOME также правильно установлен.

Я использую Mac только для целей тестирования. Мне действительно нужно некоторое руководство по этому вопросу.

Когда я запускаю его с Eclipse, выбрав JRE 7, он работает правильно. Таким образом, нет ничего плохого в приложении. Я что-то упустил в Mac OS X.

Моя системная среда 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 указывает на что-то не так.

5 ответов

Решение

вопрос

Ваш пакет приложений Mac OS X был создан с помощью пакета приложений, который не совместим с пакетом Oracle 7 Java. Пакет, который вы используете, может быть, например, Jar Bundler предоставленный Apple, который работает только для системных пакетов Apple Java 6.

Apple отказалась от поддержки Java как интегрированных системных пакетов из Java 7 и более поздних версий. Как следствие, вам нужно выбрать пакет Oracle Java 7 Third Party и их пакетное решение. Это позволяет создавать и развертывать комплекты приложений на основе Oracle Java 7 в Mac OS X 10.7.3 и более поздних версиях.

Основная техническая проблема, с которой вы столкнулись, является родной для Apple. Objective-C основан JavaAppLauncher двоичный файл и формат, который он использует в Info.plist работает только с системными пакетами Apple Java 6 и JavaAppLauncherInfo.plist Комбинация из Oracle работает только для пакетов Oracle 7 Java.

Как вы используете JavaAppLauncher Поддерживая системные пакеты Apple Java 6, он всегда будет использовать системный пакет Apple Java 6, установленный на вашем Mac.

Есть видео, где Скотт Ковач, ведущий инженер порта Mac OS X платформы Java в Oracle, рассказывает на DEVOXX о том, как пакетные приложения для Oracle Java 7 работают очень подробно.

Решение

Создание пакетов приложений для Mac OS X 10.7.3 и более поздних версий на основе

и выше, вы должны использовать пакет приложений Oracle

  • lib/appbundler-1.0.jar содержащий задачу муравья com.oracle.appbundler.AppBundlerTask

С помощью пакета приложений Oracle у вас есть возможность запустить упакованное приложение со стандартным пакетом Oracle Java 7, установленным на вашем Mac, здесь:

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

или Oracle Java 7 JRE, встроенный в ваше упакованное приложение

  • MyJavaMacOSXApp.app/Contents/PlugIns/

Примечание: у обоих подходов есть свои плюсы и минусы, но вам нужен последний с собственной JRE, если вы хотите пойти в Apple App Store со своим приложением.

Что должно быть сделано

  • Скачать 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

Соединение по умолчанию Oracle Java 7 Package (JRE)

Если вы хотите использовать пакет Oracle Java 7 по умолчанию (JRE), установленный на целевом Mac пакета приложений, в разделе

  • /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" /> записи, как вам нужно.

Примечание. Порядок элементов в задаче комплекта не сохраняется во время выполнения приложения в комплекте. 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> 

Важные документы, на которые основан этот ответ:

  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/

Существует также хорошо поддерживаемая ветвь самого appbundler, с множеством других функций и исправлений.

Версия Java, требуемая приложением, вероятно, указана в метаданных приложения. Если вы щелкните правой кнопкой мыши на приложении и выберите Показать содержимое пакета и перейдите к Info.plist файл, вы должны найти записи, которые определяют JVM, которая будет использоваться приложением. Например

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

OSX может использовать более низкую JVM, если приложение запрашивает это.

Ваша система не совсем в курсе. Я не говорю, что это является причиной вашей проблемы. Но просто чтобы быть в безопасности, я бы выступил вперед до самого последнего и величайшего.

  1. Роль вашей системы вперед через обновление системы, что вы находитесь на Mac OS X 10.8.2
  2. Установите свежую версию JRE 1.6.0_43 от Apple, известную как Java для OS X 2013-002
  3. Установите свежую версию JDK 1.6.0_43 от Apple, также известную как Java для OS X 2013-002 Developer Package 4 марта 2013 г. Чтобы получить Apple JDK, вам необходимо войти в систему, используя свой Apple ID (бесплатная учетная запись разработчика) и выполнить поиск по термину "Пакет разработчика Java для 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. Загрузите и установите Oracle JDK 1.7.0_17 для Mac OS X. Примечание. Это также включает JRE 1.7.0_17 от Oracle.
  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 из?

Просто задокументируйте шаги и усилия, которые вы сделали в своем первоначальном вопросе. Так что это отражает ваш прогресс.

ОБНОВЛЕНИЕ: решение состоит в том, чтобы создать пакет приложения Mac OS X с оракулами AppBundlerTask, Подробнее см. Мой другой ответ здесь: /questions/45729484/prilozhenie-ispolzuet-java-6-ot-apple-vmesto-java-7-ot-oracle-na-mac-os-x/45729510#45729510

Попробуйте установить это:

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)

РЕДАКТИРОВАТЬ: Впечатляющий ответ Уве абсолютно правильно для ОП, который, как выясняется, использовал AppLauncher. Мое первоначальное прочтение вопроса было связано с проблемами командной строки в OSX с Java 6 против Java 7. Комментарии к исходному вопросу показывают, что я ошибался. Однако любой, имеющий проблемы с командной строкой, может найти ниже более простое решение.

ОРИГИНАЛ: Мои обстоятельства казались такими же, как и у ОП: Java 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 работал хорошо.

Другие вопросы по тегам