Ответ 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
-
lib/appbundler-1.0.jar
, содержащий Ant Задачаcom.oracle.appbundler.AppBundlerTask
С пакетом приложений 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
:
Подключение по умолчанию для пакета Java Java 7 (JRE)
Если вы хотите использовать пакет Java 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/#st=5&id=2891&sl=37
Существует также хорошо сохранившаяся вилка самого appbundler, со многими другими функциями и исправлениями.