Приложение использует 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 и JavaAppLauncher
Info.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
:
Соединение по умолчанию 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.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>
Важные документы, на которые основан этот ответ:
- 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/
Существует также хорошо поддерживаемая ветвь самого appbundler, с множеством других функций и исправлений.
Версия Java, требуемая приложением, вероятно, указана в метаданных приложения. Если вы щелкните правой кнопкой мыши на приложении и выберите Показать содержимое пакета и перейдите к Info.plist
файл, вы должны найти записи, которые определяют JVM, которая будет использоваться приложением. Например
<key>JVMVersion</key>
<string>1.5</string>
OSX может использовать более низкую JVM, если приложение запрашивает это.
Ваша система не совсем в курсе. Я не говорю, что это является причиной вашей проблемы. Но просто чтобы быть в безопасности, я бы выступил вперед до самого последнего и величайшего.
- Роль вашей системы вперед через обновление системы, что вы находитесь на Mac OS X 10.8.2
- Установите свежую версию JRE 1.6.0_43 от Apple, известную как Java для OS X 2013-002
- Установите свежую версию JDK 1.6.0_43 от Apple, также известную как 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
из? - Что сбрасывает команду
/usr/libexec/java_home
из? - Что сбрасывает команду
echo $JAVA_HOME
из? - Что сбрасывает команду
echo $JAVA_ARCH
из? - Что сбрасывает команду
/Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java -version
из? - Что сбрасывает команду
ls /Library/Java/JavaVirtualMachines
из? - Что сбрасывает команду
/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
работал хорошо.