28 votos

¿Aplicación está utilizando Java 6 de Apple en lugar de Java 7 de Oracle en Mac OS X?

Estoy probando mi aplicación actual con Mac OS X, que tiene Java 7 de Oracle instalado. En lugar de utilizar Java 7 de Oracle, es el uso de Java 6 de Apple. El valor predeterminado de salida del sistema de java -version muestra 7.

He probado la mayoría de las cosas mencionadas en diferentes sitios, pero yo era incapaz de arreglar este problema.

JAVA_HOME está correctamente configurado.

Estoy usando el Mac sólo para propósitos de prueba. Realmente necesito algo de orientación sobre este.

Cuando lo ejecuto con Eclipse mediante la selección de JRE 7, que funciona correctamente. Por lo tanto no hay nada de malo con la aplicación. Me falta algo en Mac OS X.

Mi Java entorno de sistema se parece a esto:

  • Versión de 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 no está configurado

  • /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"
    

Supongo que mi actual del JDK está señalando algo mal.

79voto

Uwe Günther Puntos 1595

Problema

Su aplicación para Mac OS X paquete ha sido creado con una aplicación bundler que no es compatible con Oracle Java 7 paquete. Bundler que estaban usando, podría ser, por ejemplo, Jar Bundler proporcionar por Apple, que sólo funciona para Java de Apple 6 Paquetes del Sistema.

Apple ha dado soporte para Java como un Sistema integrado en Paquetes de Java 7 y versiones posteriores. Como consecuencia de ello tienes que ir a por el Oracle Java 7 paquete de Terceros y su aplicación en el paquete de paquete de la solución. Esto permite que usted para crear e implementar Oracle Java 7 aplicación basada en paquetes en Mac OS X 10.7.3 y en adelante.

Las técnicas subyacentes problema que se enfrenta es de Apple nativa Objective-C base JavaAppLauncher binario y el formato que se utiliza en Info.plist sólo está trabajando con Java de Apple 6 Paquetes del Sistema y el JavaAppLauncher Info.plist combinación procedentes de Oracle está trabajando sólo para Oracle Java 7 Paquetes.

Como usted está usando un JavaAppLauncher de apoyo de Apple Java 6 Paquetes del Sistema, siempre tomará el Apple Java 6 Paquete de Sistema instalado en su Mac.

Hay un videodonde Scott Kovatch, el ingeniero jefe para el Mac OS X puerto de la plataforma Java en Oracle está hablando en DEVOXX acerca de cómo la aplicación de la paquetización de Oracle Java 7 está trabajando en gran detalle.

Solución

Para crear la aplicación de paquetes basado en Mac OS X 10.7.3 y en adelante, basado en

y, encima, tienes que usar Oracle aplicación bundler

Con Oracle aplicación bundler ahora usted tiene la opción para ejecutar el empaquetado de la aplicación con la omisión de Oracle Java 7 los Paquetes instalados en tu Mac aquí:

  • /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/

o el Oracle Java 7 JRE usted en línea en sus aplicaciones empaquetadas

  • MyJavaMacOSXApp.app/Contents/PlugIns/

Nota: Hay pros y contras para ambos enfoques, pero usted necesita la última con su propio JRE si quieres ir a la App Store de Apple con su liado aplicación.

Lo que se necesita hacer

  • Descargar appbundler-1.0.jar y moverlo a <project>/lib/appbundler-1.0.jar
  • Agregue lo siguiente a su <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>
    



    Nota: Usted necesita para reemplazar MyJavaMacOSXApp con los datos de la aplicación. Usted puede encontrar aquí algunos adicionales AppBundlerTask opciones, como muestra este ejemplo sólo cómo funciona en su forma más simple.

  • Después de ejecutar el la bundle destino con ant bundle encontrará MyJavaMacOSXApp.app en la <project>/dist directorio.

¿Qué hace el <runtime dir="${env.JAVA_HOME}" /> elemento?

Inline Oracle Java 7 Paquete (JRE)

La Hormiga destino anterior copia el Oracle Java 7 Paquete (JRE) de su

  • JAVA_HOME

en

  • MyJavaMacOSXApp.app/Contents/PlugIns

Por lo que el paquete de la aplicación es totalmente autónomo y no necesita de Oracle Java 7 Paquete (JRE) instalado en el sistema de destino. Como se puede ver en la siguiente captura de pantalla de un desplegado MyJavaMacOSXApp.app:

MyJavaMacOSXApp Inline JRE

Cableado por defecto de Oracle Java 7 Paquete (JRE)

Si desea utilizar el valor por defecto de Oracle Java 7 Paquete (JRE) instalado en el paquete de aplicaciones de Mac de destino en virtud de

  • /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/

usted tiene que quitar la

  • <runtime dir="${env.JAVA_HOME}" />

elemento fromt la bundle tarea. Como se puede ver en la siguiente captura de pantalla de un desplegado MyJavaMacOSXApp.app:

MyJavaMacOSXApp Inline JRE

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

¿Qué pasa si mi app tiene varios archivos jar?

Sólo añadir tantos <classpath file="dist/additional.jar" /> entradas como usted necesita.

Nota: El orden de los elementos en el paquete de tarea no se conservó en el tiempo de ejecución de su liado aplicación. El java.class.path se genera en tiempo de ejecución por los nativos de la JavaAppLauncher como se lee en la *.jars de MyJavaMacOSXApp.app/Contents/Java directorio.


Sólo para la integridad: esta es la forma en Info.plist tiene este aspecto:

<?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> 

Documentos importantes de esta respuesta está basada en:

  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

También hay un bien mantenido tenedor de appbundler sí mismo, con muchas más características y correcciones de errores.

4voto

Uwe Günther Puntos 1595

El sistema no es realmente hasta la fecha. No estoy diciendo que esto es la causa de su problema. Pero sólo para estar en el lado seguro me gustaría papel hacia adelante a la última y más grande.

  1. Papel que el sistema hacia adelante a través de la actualización del Sistema, que está en Mac OS X 10.8.2
  2. Instalar un nuevo JRE 1.6.0_43 de Apple también conocido como Java para OS X 2013-002
  3. Instalar un nuevo JDK 1.6.0_43 de Apple también conocido como Java para OS X 2013-002 Desarrollador del Paquete Mar 4, 2013. Con el fin de obtener la Manzana JDK usted tiene que iniciar sesión con su ID de Apple (gratis Cuenta de Desarrollador) y la búsqueda de la palabra "Java para OS X 2013-002 Desarrollador del Paquete". Lamentable no hay ningún vínculo directo para ese paquete.
  4. Eliminar su anticuado Oracle JDK: sudo rm -rf /Library/Java/JavaVirtualMachines/jdk1.7.0_12.jdk. Nota: Eso es seguro, porque en el siguiente paso vamos a instalar el Oracle JDK 1.7.0_17.
  5. Descargar e instalar Oracle JDK 1.7.0_17 para Mac OS X. Nota: Esto también incluye el JRE 1.7.0_17 de Oracle.
  6. Hacer un reinicio.

Después de haber terminado todos los pasos anteriores, por favor, venir con la siguiente salida de nuevo:

  1. Que versión de OS X que utilizan?
  2. Lo vuelca el comando /usr/libexec/java_home -V ?
  3. Lo vuelca el comando /usr/libexec/java_home ?
  4. Lo vuelca el comando echo $JAVA_HOME ?
  5. Lo vuelca el comando echo $JAVA_ARCH ?
  6. Lo vuelca el comando /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java -version ?
  7. Lo vuelca el comando ls /Library/Java/JavaVirtualMachines ?
  8. Lo vuelca el comando /System/Library/Frameworks/JavaVM.framework/Commands/java -version ?

Sólo documento los pasos y el esfuerzo que hiciste en tu pregunta original. Así lo refleja su progreso.

ACTUALIZACIÓN: La solución es crear una aplicación para Mac OS X paquete con los Oráculos AppBundlerTask. Para más detalles, ver mi otra respuesta aquí: http://stackoverflow.com/a/15271448

4voto

Armand Puntos 4075

La versión de Java requerida por la aplicación es probable en los metadatos de la aplicación. Si haga clic en la aplicación y seleccione Mostrar contenido del paquete y vaya a la Info.plist archivo, encontrará entradas que definen la JVM que utilizará la aplicación. Por ejemplo

    <key>JVMVersion</key>
    <string>1.5</string>

OSX puede optar por utilizar una JVM inferior si la aplicación lo solicita.

1voto

Andrew E Puntos 634

EDIT: Uwe impresionante la respuesta es absolutamente correcta para el OP que resulta que estaba usando el AppLauncher. Mi primera lectura de la cuestión que se relaciona con la línea de comandos de problemas en OSX con Java 6 vs Java 7. Los comentarios sobre la pregunta original demostrar que estaba equivocado. Sin embargo, cualquiera que tenga la línea de comandos de problemas puede encontrar la siguiente solución más sencilla.

ORIGINAL: Mis circunstancias parecía el mismo que pensé que el OP tenido: Java 1.7 perfectamente en la línea de comandos, pero mvn a fallar y a quejarse de 1.6, general de compilación había estado trabajando bien con sbt y IntelliJ. Yo sólo comenzó a tener problemas para compilar un tercero, un proyecto con mvn.

He encontrado que esto funcione bien y ser mucho más simple:

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

Todo lo que necesitaba desde que se fue el siguiente .perfil:

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

Establecer variable e mvn funcionado bien.

1voto

candylady Puntos 15

Prueba a instalar esto:

http://support.Apple.com/kb/dl1572

InteliJ funciona muy bien, mientras estoy aún en Java SE 7 usando por ejemplo 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)

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X