Je teste mon application actuelle avec Mac OS X sur lequel est installé Java 7 d'Oracle. À la place, j'utilise Java 7 d'Oracle, il utilise Java 6 d'Apple. La sortie système par défaut de Java -version
montre 7
.
J'ai essayé la plupart des choses mentionnées sur différents sites, mais je n'ai pas pu résoudre ce problème.
Java_HOME
est également correctement défini.
J'utilise le Mac uniquement à des fins de test. J'ai vraiment besoin de conseils à ce sujet.
Lorsque je l'exécute avec Eclipse en sélectionnant JRE 7, il fonctionne correctement. Il n'y a donc rien de mal à l'application. Il me manque quelque chose sur Mac OS X.
Mon Java ressemble à ceci:
Version 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
n'est pas défini
/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"
Je suppose que mon JDK actuel pointe vers quelque chose de mal.
Votre bundle d'application Mac OS X a été créé avec un bundle d'application qui n'est pas compatible avec Oracle Java 7. Le bundler que vous utilisiez pourrait être, par exemple, Jar Bundler
fournir par Apple qui ne fonctionne que pour Java 6 packages système Apple).
Apple a abandonné la prise en charge de Java en tant que packages système intégrés à partir de Java 7 et versions ultérieures. Par conséquent, vous devez opter pour Oracle Java 7 Package tiers et leur solution de package de package d'application. Cela vous permet de créer et de déployer Oracle Java 7 bundles d'application basés sur Mac OS X 10.7.3 et versions ultérieures).
Le problème technique sous-jacent auquel vous êtes confronté est le natif d'Apple Objective-C
basé JavaAppLauncher
binaire et le format qu'il utilise dans Info.plist
ne fonctionne qu'avec Apple Java 6 packages système et JavaAppLauncher
Info.plist
la combinaison provenant d'Oracle ne fonctionne que pour les packages Oracle Java 7 packages.
Comme vous utilisez un JavaAppLauncher
prenant en charge Apple Java 6 packages système, il récupérera toujours le Apple Java 6 Package système installé sur votre Mac.
Il y a un vidéo , où Scott Kovatch, l'ingénieur principal pour le port Mac OS X de la plate-forme Java chez Oracle) parle sur DEVOXX de la façon dont le regroupement d'applications pour Oracle Java 7 fonctionne en détail.
Pour créer des ensembles d'applications basés sur Mac OS X 10.7.3 et versions ultérieures basés sur
et au-dessus, vous devez utiliser le bundle d'applications d'Oracle
lib/appbundler-1.0.jar
contenant la tâche Ant com.Oracle.appbundler.AppBundlerTask
Avec le bundle d'applications Oracle, vous avez maintenant le choix d'exécuter votre application packagée avec le package Oracle Java 7 Package installé sur votre Mac ici:
/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/
ou Oracle Java 7 JRE vous inline dans votre application packagée
MyJavaMacOSXApp.app/Contents/PlugIns/
Remarque: Il existe des avantages et des inconvénients pour les deux approches, mais vous avez besoin de la dernière avec votre propre JRE si vous souhaitez accéder à l'App Store Apple avec votre application groupée).
appbundler-1.0.jar
et déplacez-le vers <project>/lib/appbundler-1.0.jar
Ajoutez ce qui suit à 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
par vos données d'application. Vous pouvez trouver ici quelques options supplémentaires AppBundlerTask
, car cet exemple montre uniquement comment il fonctionne dans sa forme la plus simple.
Après avoir exécuté la cible bundle
avec ant bundle
tu trouveras MyJavaMacOSXApp.app
dans le <project>/dist
répertoire.
<runtime dir="${env.Java_HOME}" />
élément?Inlining Oracle Java 7 Package (JRE)
La cible Ant ci-dessus copie le package Oracle Java 7 Package (JRE) de votre
Java_HOME
dans
MyJavaMacOSXApp.app/Contents/PlugIns
Le package d'application est donc totalement autonome et ne nécessite aucun Oracle Java 7 Package (JRE) installé sur le système cible. Comme vous pouvez le voir dans la capture d'écran suivante d'un tel déploiement MyJavaMacOSXApp.app
:
Câblage par défaut Oracle Java 7 Package (JRE)
Si vous souhaitez utiliser le package Oracle Java 7 Package (JRE) par défaut installé sur le groupe cible cible Mac sous
/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/
vous devez supprimer le
<runtime dir="${env.Java_HOME}" />
de la tâche bundle
. Comme vous pouvez le voir dans la capture d'écran suivante d'un tel déployé MyJavaMacOSXApp.app
:
Source de 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();
}
});
}
}
Ajoutez simplement autant de <classpath file="dist/additional.jar" />
entrées selon vos besoins.
Remarque: L'ordre des éléments dans la tâche de regroupement n'est pas conservé lors de l'exécution de votre application groupée. Le Java.class.path
est construit au moment de l'exécution par le JavaAppLauncher
natif tel qu'il se lit dans le *.jar
s de MyJavaMacOSXApp.app/Contents/Java
répertoire.
Juste pour être complet, voici comment Info.plist
ressemble à:
<?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 sur lesquels repose cette réponse:
Il existe également une fourchette bien maintenue d'Appbundler lui-même, avec de nombreuses autres fonctionnalités et corrections de bogues.
La version Java requise par l'application est probablement spécifiée dans les métadonnées de l'application. Si vous cliquez avec le bouton droit sur l'application et sélectionnez Afficher le contenu du package et accédez au Info.plist
, vous devriez trouver des entrées qui définissent la machine virtuelle Java que l'application utilisera. Par exemple.
<key>JVMVersion</key>
<string>1.5</string>
OSX peut choisir d'utiliser une machine virtuelle Java inférieure si l'application le demande.
Votre système n'est pas vraiment à jour. Je ne dis pas que cela cause votre problème. Mais juste pour être du bon côté, je jouerais un rôle de plus en plus récent.
Sudo rm -rf /Library/Java/JavaVirtualMachines/jdk1.7.0_12.jdk
. Remarque: C'est sûr car à l'étape suivante, nous installons le JDK 1.7.0_17 d'Oracle actuel.Une fois que vous avez terminé toutes les étapes ci-dessus, veuillez à nouveau fournir la sortie suivante:
/usr/libexec/Java_home -V
en dehors?/usr/libexec/Java_home
en dehors?echo $Java_HOME
en dehors?echo $Java_Arch
en dehors?/Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/Java -version
en dehors?ls /Library/Java/JavaVirtualMachines
en dehors?/System/Library/Frameworks/JavaVM.framework/Commands/Java -version
en dehors?Documentez simplement les étapes et l'effort que vous avez fait dans votre question d'origine. Cela reflète donc vos progrès.
MISE À JOUR: La solution consiste à créer un ensemble d'applications Mac OS X avec Oracles AppBundlerTask
. Pour plus de détails, voir mon autre réponse ici: https://stackoverflow.com/a/15271448
Essayez d'installer ceci:
http://support.Apple.com/kb/dl1572
InteliJ fonctionne très bien, alors que je suis toujours sur Java SE 7 en utilisant par exemple 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)
EDIT: La réponse impressionnante d'Uwe est absolument correcte pour l'OP qui s'avère utiliser l'AppLauncher. Ma première lecture de la question était qu'elle était liée à des problèmes de ligne de commande sur OSX avec Java 6 vs Java 7. Le les commentaires sur la question d'origine montrent que j'avais tort. Cependant, toute personne ayant des problèmes de ligne de commande peut trouver ci-dessous une solution plus simple.
ORIGINAL: Mes circonstances semblaient les mêmes que je pensais que l'OP avait: Java 1.7 parfaitement sur la ligne de commande mais mvn
échouant et se plaignant de 1.6, la compilation générale fonctionnait bien en utilisant sbt
et IntelliJ. J'ai seulement commencé à avoir des problèmes pour compiler un projet tiers avec mvn
.
J'ai trouvé que cela fonctionnait bien et était beaucoup plus simple:
http://www.jayway.com/2013/03/08/configuring-maven-to-use-Java-7-on-mac-os-x/
Tout ce dont j'avais besoin était le suivant dans .profile:
export Java_HOME=`/usr/libexec/Java_home -v 1.7`
Définissez cette variable et mvn
a bien fonctionné.