Question
Votre application pour Mac OS X bundle a été créé avec une application bundler qui n'est pas compatible avec Oracle Java 7. Le bundler vous utilisez pourrait être, par exemple, Jar Bundler
fournir par Apple qui fonctionne uniquement pour Apple Java 6 Système de Paquets.
Apple a abandonné le support de Java comme un Système intégré Forfaits à partir de Java 7 et les versions ultérieures. En conséquence, vous devez aller pour l'Oracle Java 7 Troisième Partie du package et de leur application package bundle solution. Cela vous permet de créer et de déployer Oracle Java 7 ensembles d'application sur Mac OS X 10.7.3 et au-delà.
La technique sous-jacente problème que vous rencontrez est Apple natif Objective-C
base JavaAppLauncher
binaire et le format qu'il utilise en Info.plist
est seulement en travaillant avec Apple Java 6 Paquets du Système et de l' JavaAppLauncher
Info.plist
combinaison à venir à partir d'Oracle ne fonctionne que pour Oracle Java 7 Paquets.
Comme vous utilisez un JavaAppLauncher
soutien d'Apple Java 6 Paquets du Système, il prendra toujours la Pomme de Java 6 Système de Paquet installé sur votre Mac.
Il y a une vidéo, où Scott Kovatch, l'ingénieur en chef pour le Mac OS X port de la plate-forme Java chez Oracle est en train de parler sur DEVOXX sur la façon de l'app regroupement pour Oracle Java 7 est de travailler dans le plus grand détail.
Solution
Pour créer app faisceaux en fonction pour Mac OS X 10.7.3 et au-delà basé sur
et au-dessus, vous devez utiliser Oracle application bundler
Avec Oracle application bundler vous avez maintenant le choix pour exécuter votre package d'application avec la valeur par défaut d'Oracle Java 7 Paquet installé sur votre Mac en cliquant ici:
/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/
ou l'Oracle Java JRE 7 vous en ligne dans votre package d'application
MyJavaMacOSXApp.app/Contents/PlugIns/
Remarque: Il ya des avantages et des inconvénients pour les deux approches, mais vous avez besoin de le dernier avec vos propres JRE si vous voulez aller à l'App Store d'Apple avec votre forfait app.
Ce qui doit être fait
- Téléchargez
appbundler-1.0.jar
et déplacez - <project>/lib/appbundler-1.0.jar
-
Ajoutez les lignes suivantes à votre <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>
Remarque: Vous devez remplacer MyJavaMacOSXApp
vos données d'application. Vous pouvez trouver ici quelques autres AppBundlerTask
options, comme cet exemple le montre seulement comment la façon dont il fonctionne dans sa forme la plus simple.
Après l'exécution de la de la bundle
cible avec ant bundle
vous trouverez MyJavaMacOSXApp.app
dans la <project>/dist
répertoire.
Ce qui ne l' <runtime dir="${env.JAVA_HOME}" />
élément?
Inline Oracle Java 7 (JRE)
La cible Ant au-dessus des copies de l'Oracle Java 7 (JRE) à partir de votre
en
MyJavaMacOSXApp.app/Contents/PlugIns
Si le package de l'application est totalement autonome et n'a pas besoin d'un Oracle Java 7 (JRE) est installé sur le système cible à tous. Comme vous pouvez le voir dans la capture d'écran suivante de telle déployé MyJavaMacOSXApp.app
:
Câblage par défaut d'Oracle Java 7 (JRE)
Si vous souhaitez utiliser la valeur par défaut d'Oracle Java 7 (JRE) installé sur le bundle de l'application Mac cible sous
-
/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/
vous devez supprimer l'
-
<runtime dir="${env.JAVA_HOME}" />
élément fromt l' bundle
de la tâche. Comme vous pouvez le voir dans la capture d'écran suivante de telle déployé MyJavaMacOSXApp.app
:
Source de l' 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 javaHomeLabel = new JLabel("java.home=" + System.getProperty("java.home"));
setLayout(new BorderLayout());
add(versionLabel, BorderLayout.PAGE_START);
add(javaHomeLabel, 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) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
Que faire si mon appli a plusieurs fichiers jar?
Juste ajouter autant d' <classpath file="dist/additional.jar" />
d'entrées que vous avez besoin.
Remarque: L'ordre des éléments dans le bundle de la tâche n'est pas conservé lors de l'exécution de votre forfait app. L' java.class.path
se construit jusqu'au moment de l'exécution par le natif JavaAppLauncher
comme on le lit dans l' *.jar
s de MyJavaMacOSXApp.app/Contents/Java
répertoire.
Juste pour être complet: c'est combien de Info.plist
ressemble à ceci:
<?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>
Documents importants cette réponse est basée sur:
- 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
Il est également bien entretenu, fourche de appbundler lui-même, avec beaucoup plus de fonctionnalités et corrections de bugs.