Подтвердить что ты не робот

Приложение использует 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 указывает на что-то не так.

4b9b3361

Ответ 1

Проблема

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

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

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

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

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

Решение

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

и выше, вы должны использовать Oracle app bundler

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

  • /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 (JRE) из вашего

  • JAVA_HOME

в

  • MyJavaMacOSXApp.app/Contents/PlugIns

Таким образом, пакет приложений полностью автономный и не нуждается в пакете Oracle Java 7 Package (JRE), установленном в целевой системе. Как вы можете видеть на следующем снимке экрана такого развернутого MyJavaMacOSXApp.app:

MyJavaMacOSXApp Inline JRE

Подключение по умолчанию для пакета Java Java 7 (JRE)

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

  • /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 создается во время выполнения встроенным 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> 

Важные документы Этот ответ основан на:

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

Ответ 2

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

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

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

Ответ 3

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

  • Роль вашей системы вперед с помощью обновления системы, что вы находитесь в Mac OS X 10.8.2
  • Установить новый JRE 1.6.0_43 от Apple aka Java для OS X 2013-002
  • Установить новый JDK 1.6.0_43 от Apple aka Java для OS X 2013-002 Developer Package 4 марта 2013 г.. Чтобы получить Apple JDK, вам нужно войти в систему с вашим Apple ID (бесплатная учетная запись разработчика) и найти термин "Java для OS X 2013-002". К сожалению, нет прямой ссылки для этого пакета.
  • Удалите устаревший Oracle JDK: sudo rm -rf /Library/Java/JavaVirtualMachines/jdk1.7.0_12.jdk. Примечание. Это безопасно, потому что на следующем шаге мы устанавливаем текущий Oracle JDK 1.7.0_17.
  • Загрузите и установите Oracle JDK 1.7.0_17 для Mac OS X. Примечание. Это также относится к JRE 1.7.0_17 от Oracle.
  • Выполните перезагрузку.

После того, как вы закончили все шаги сверху, повторите следующий вывод:

  • Какую версию OS X вы используете?
  • Что выгружает команду /usr/libexec/java_home -V out?
  • Что выгружает команду /usr/libexec/java_home out?
  • Что выгружает команду echo $JAVA_HOME out?
  • Что выгружает команду echo $JAVA_ARCH out?
  • Что выгружает команду /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java -version out?
  • Что выгружает команду ls /Library/Java/JavaVirtualMachines out?
  • Что выгружает команду /System/Library/Frameworks/JavaVM.framework/Commands/java -version out?

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

ОБНОВЛЕНИЕ:. Решение состоит в том, чтобы создать пакет приложений для Mac OS X с помощью Oracles AppBundlerTask. Подробнее см. Мой другой ответ здесь: fooobar.com/questions/155733/...

Ответ 4

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

ORIGINAL: Мои обстоятельства казались такими же, как я думал, что у OP: 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. Хорошо.

Ответ 5

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

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)