35 votes

Application utilise Java 6 d'Apple au lieu de Java 7 d'Oracle sur Mac OS X?

Je suis en train de tester mon application actuelle avec Mac OS X qui a Java 7 d'Oracle installé. Au lieu d'utiliser Java 7 d'Oracle, c'est à l'aide de Java 6 d'Apple. Le système par défaut de sortie d' java -version montre 7.

J'ai essayé la plupart des choses mentionnées dans les différents sites, mais j'ai été incapable de résoudre ce problème.

JAVA_HOME est correctement réglé.

Je suis en utilisant le Mac uniquement à des fins de test. J'ai vraiment besoin de conseils à ce sujet.

Quand je le lance avec Eclipse en sélectionnant JRE 7, il fonctionne correctement. Ainsi, il n'y a rien de mal avec l'application. Je suis absent quelque chose sur Mac OS X.

Mon Java environnement de système d'ressemble à ceci:

  • OS X version

    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éfinie

  • /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 pointe vers quelque chose de mal.

90voto

Uwe Günther Points 1595

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

  • JAVA_HOME

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:

MyJavaMacOSXApp Inline JRE

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:

MyJavaMacOSXApp Inline JRE

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' *.jars 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:

  1. http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/packagingAppsForMac.html
  2. http://java.net/projects/appbundler/pages/Home
  3. http://java.net/downloads/appbundler/appbundler.html
  4. http://intransitione.com/blog/take-java-to-app-store/
  5. 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.

4voto

Armand Points 4075

La version Java requise par l'application est probablement spécifiée dans les métadonnées de l'application. Si vous cliquez à droite sur l'application et sélectionnez Afficher les contenus du paquet et naviguer dans le fichier, vous devez trouver des `` entrées qui définissent le JVM que l'application utilisera. P. ex.

OSX peut choisir d'utiliser un JVM inférieur si l'application le demande.

4voto

Uwe Günther Points 1595

Votre système n'est pas vraiment à jour. Je ne dis pas que c'est la cause de votre problème. Mais juste pour être sur le côté sécuritaire, je voudrais rôle de l'avant les plus récents et les plus grands.

  1. Rôle de votre système via le Système de mise à jour, que vous êtes sur Mac OS X 10.8.2
  2. Installer une nouvelle JRE 1.6.0_43 d'Apple aka Java pour OS X 2013-002
  3. Installer une nouvelle version de JDK 1.6.0_43 d'Apple aka Java pour OS X 2013-002 Développeur Paquet Mar 4, 2013. Afin d'obtenir l'Apple JDK vous devez vous connecter avec votre IDENTIFIANT Apple (Compte Développeur gratuit) et recherchez le terme "Java pour OS X 2013-002 Développeur Package". Malheureux, il n'y a pas de lien direct pour ce package.
  4. Supprimer votre ancien Oracle JDK: sudo rm -rf /Library/Java/JavaVirtualMachines/jdk1.7.0_12.jdk. Remarque: c'est sûr, parce que dans la prochaine étape de l'installation de l'actuel Oracle JDK 1.7.0_17.
  5. Télécharger et installer Oracle JDK 1.7.0_17 pour Mac OS X. Remarque: Ce n'incluent également le JRE 1.7.0_17 à partir d'Oracle.
  6. Faire un reboot.

Après vous avez terminé toutes les étapes à partir de ci-dessus, s'il vous plaît venez avec la sortie suivante de nouveau:

  1. Qui OS X version utilisez-vous?
  2. Ce que retourne la commande /usr/libexec/java_home -V - out?
  3. Ce que retourne la commande /usr/libexec/java_home - out?
  4. Ce que retourne la commande echo $JAVA_HOME - out?
  5. Ce que retourne la commande echo $JAVA_ARCH - out?
  6. Ce que retourne la commande /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java -version - out?
  7. Ce que retourne la commande ls /Library/Java/JavaVirtualMachines - out?
  8. Ce que retourne la commande /System/Library/Frameworks/JavaVM.framework/Commands/java -version - out?

Documenter les étapes et l'effort que vous avez fait dans votre question initiale. Afin de tenir compte de vos progrès.

Mise à JOUR: La solution est de créer une application pour Mac OS X bundle avec des Oracles, AppBundlerTask. Pour plus de détails voir mon autre réponse ici: http://stackoverflow.com/a/15271448

1voto

Andrew E Points 634

EDIT: Uwe impressionnante de réponse est tout à fait correcte pour l'OP qui il s'avère que c'était à l'aide de la AppLauncher. Ma première lecture de la question est qu'elle est liée à la ligne de commande de questions sur OSX avec Java 6 vs Java 7. Les commentaires sur la question de la première exposition, j'ai été mauvais. Cependant, toute personne ayant en ligne de commande les questions peuvent trouver ci-dessous une solution plus simple.

ORIGINE: Ma situation semble la même que j'ai pensé que l'OP avait: Java 1.7 parfaitement sur la ligne de commande, mais mvn d'échouer et de se plaindre sur la 1.6, le général de compilation avait été fonctionne bien en utilisant sbt et IntelliJ. J'ai seulement commencé à avoir des problèmes à la compilation d'un tiers de projet avec mvn.

J'ai trouvé que cela fonctionne bien et est beaucoup plus simple:

http://www.jayway.com/2013/03/08/configuring-maven-to-use-java-7-on-mac-os-x/

Tout ce que je besoin de qui a été le suivant .profil:

export JAVA_HOME=`/usr/libexec/java_home -v 1.7`

Définissez cette variable et mvn a bien fonctionné.

1voto

candylady Points 15

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X