web-dev-qa-db-fra.com

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

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.

35
amod

Problème

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 JavaAppLauncherInfo.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.

Solution

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

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).

Ce qui doit être fait

  • Télécharger 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.

Que fait le <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:

MyJavaMacOSXApp Inline JRE

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:

MyJavaMacOSXApp Inline JRE

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();
            }
        });
    }
}

Que faire si mon application possède plusieurs fichiers jar?

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

  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 existe également une fourchette bien maintenue d'Appbundler lui-même, avec de nombreuses autres fonctionnalités et corrections de bogues.

90
Uwe Günther

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.

4
Armand

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.

  1. Rôlez votre système vers l'avant via la mise à jour du système, que vous êtes sous Mac OS X 10.8.2
  2. Installez un nouveau JRE 1.6.0_43 à partir de Apple aka Java pour OS X 2013-002
  3. Installez un nouveau JDK 1.6.0_43 à partir de Apple aka Java pour OS X 2013-002 Developer Package 4 mars 201 . Pour obtenir le Apple JDK, vous devez vous connecter ici avec votre Apple (compte de développeur gratuit) et rechercher le terme "Java for OS X 2013-002 Developer Package". Malheureusement, il n'y a pas lien direct pour ce package.
  4. Supprimez votre JDK Oracle obsolète: 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.
  5. Téléchargez et installez Oracle JDK 1.7.0_17 pour Mac OS X . Remarque: Cela inclut également le JRE 1.7.0_17 d'Oracle.
  6. Faites un redémarrage.

Une fois que vous avez terminé toutes les étapes ci-dessus, veuillez à nouveau fournir la sortie suivante:

  1. Quelle version d'OS X utilisez-vous?
  2. Ce qui vide la commande /usr/libexec/Java_home -V en dehors?
  3. Ce qui vide la commande /usr/libexec/Java_home en dehors?
  4. Ce qui vide la commande echo $Java_HOME en dehors?
  5. Ce qui vide la commande echo $Java_Arch en dehors?
  6. Ce qui vide la commande /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/Java -version en dehors?
  7. Ce qui vide la commande ls /Library/Java/JavaVirtualMachines en dehors?
  8. Ce qui vide la commande /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

4
Uwe Günther

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)
1
candylady

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

1
Andrew E