2010-05-17 22 views
22

Tengo que escribir un código para una aplicación heredada que aún ejecuta JDK 1.5. Desafortunadamente, parece que OS   X no tiene realmente un 1.5 JDK instalado; sólo vincula a 1,6:Cómo obtener JDK 1.5 en Mac OS X

/System/Library/Frameworks/JavaVM.framework/Versions $ ls -l 
lrwxr-xr-x 1 root wheel 5 Apr 26 11:53 1.3 -> 1.3.1 
drwxr-xr-x 3 root wheel 102 Feb 11 15:33 1.3.1 
lrwxr-xr-x 1 root wheel 10 Apr 26 11:53 1.4 -> CurrentJDK 
lrwxr-xr-x 1 root wheel 10 Apr 26 11:53 1.4.2 -> CurrentJDK 
lrwxr-xr-x 1 root wheel 10 Apr 26 11:53 1.5 -> CurrentJDK 
lrwxr-xr-x 1 root wheel 10 Apr 26 11:53 1.5.0 -> CurrentJDK 
lrwxr-xr-x 1 root wheel 5 Apr 26 11:53 1.6 -> 1.6.0 
drwxr-xr-x 7 root wheel 238 Apr 26 11:53 1.6.0 
drwxr-xr-x 8 root wheel 272 Apr 26 11:53 A 
lrwxr-xr-x 1 root wheel 1 Apr 26 11:53 Current -> A 
lrwxr-xr-x 1 root wheel 3 Apr 26 11:53 CurrentJDK -> 1.6 

Suena como http://developer.apple.com/java/faq/ de que Java es parte de la actualización del sistema operativo ... Estoy en Mac OS X v10.6.3 (Snow Leopard  ). ¿Hay alguna forma de instalar un 1.5 JDK real en esta versión del sistema operativo?

¿Debo intentar encontrar una versión anterior de OS   X antes de que pueda hacer este trabajo?

Respuesta

5

Si está escribiendo código en Eclipse o potencialmente en algún otro IDE, debería poder configurarlo para que cumpla 1.5.

Si está utilizando javac directamente, puede probar las opciones -source 1.5 y/o -target 1.5 javac, que pueden ser suficientes para lo que está haciendo? El 1.6 JDK debería ser capaz de producir código compatible con 1.5.

+11

Solo una nota de que incluso esta es una mejor estimación de compatibilidad. Si se utilizan nuevas clases o métodos de JDK 1.6, todavía estás jodido. Me han mordido tantas veces desde que osx tiró 1.5, es bastante exasperante. –

+6

-1 No siempre funciona cuando se establece el cumplimiento del objetivo en 1.5. Tengo este problema exacto, porque java.sql.CallableStatement cambió radicalmente entre 1.5 y 1.6. Algunas clases en este proyecto que estoy tratando de construir implementan esa interfaz de acuerdo con la versión 1.5, por lo que cuando intento construir (incluso con 1.5 compliance) se queja de que las clases no implementan completamente la interfaz ... porque la interfaz es la versión 1.6 a pesar de usar 1.5 cumplimiento. –

+0

que tienen el mismo problema que Kenny:.. IsWrapperFor (java.lang.Class se añadió a java.sql.Wrapper en la versión 1.6 de Java Configuración de origen/destino no ayuda con este – oligofren

-4

Necesita una versión anterior de OS X para eso.

+2

Eso es simplemente incorrecto. Puede obtenerlo desde apple: http://support.apple.com/downloads/Java_for_Mac_OS_X_10_5_Update_9 Aquí hay un script para instalarlo: http://blog.arkey.fr/2011/08/22/ script-pour-installer-le-jdk-5-sur-macosx-lion/ – oligofren

6

No necesita una copia de Java 1.5 para desarrollarlo; Java 1.6 es compatible con versiones anteriores de Java 1.5, por lo que todo lo que funcionaría en 1.5 funcionará en 1.6. Los indicadores -source y -target pueden ser útiles para garantizar que todo funcione en 1.5. Dicho esto, this article explicará cómo obtener una copia de Java 1.5 en Snow Leopard. Tenga en cuenta, sin embargo, que podría dañar/dañar su sistema.

+0

El JRE es compatible con versiones anteriores. No es así con el JDK; Si alguna clase implementa nuevas interfaces en el jdk que está utilizando, entonces obtendrá un error que le indicará que necesita implementar estos nuevos métodos. – oligofren

+0

Correcto, pero ¿con qué frecuencia se elimina o cambia el nombre de un método de una versión del JDK a otra? Normalmente, los métodos solo se agregan. Las depredaciones generalmente toman varias versiones del JDK para eliminarse por completo. –

+0

Ehh ... exactamente :) Nunca mencioné la eliminación de métodos. Si intenta compilar el código fuente creado para JDK 1.5 con JDK 1.6, y ese código fuente implementa interfaces que, como se han extendido (métodos agregados) en JDK 1.6, tendrá que cambiar el código fuente anterior para implementar los nuevos métodos. ¿Compatibilidad al revés? – oligofren

12

Eche un vistazo a http://wiki.oneswarm.org/index.php/OS_X_10.6_Snow_Leopard sobre cómo obtener e instalar 1.4 y 1.5 JDK en Snow Leopard. También tenga en cuenta que siempre que ejecute Actualización de software y se instale una actualización de JDK, deberá "arreglar" los enlaces simbólicos a los JDK 1.4 y 1.5.

ACTUALIZACIÓN: como nota al margen, para aquellos en desarrollo con varios JDK en OS X, echar un vistazo a esta pequeña utilidad práctica para cambiar JDK desde la línea de comandos: setjdk.

+0

ese enlace funciona bien – Clocker

0

Aunque se pueden usar los indicadores -source y -target, no siempre producen código que funcione en todos los JRE anteriores. Definitivamente tuve ocasiones en las que intenté realizar una compilación de respaldo a un código producido por una especificación anterior que funcionaba bien para algunos usuarios, pero que no se podía ejecutar en otros. Para estar realmente seguro de que todos los que usan un JRE 1.5 o 1.4 pueden ejecutar su código, probablemente debería hacer sus compilaciones de producción con un JDK de 1.5 o 1.4.

me encontré con estas instrucciones muy útiles en conseguir un "verdadero" 1.5 y 1.4 del JDK instalado bajo el leopardo de nieve: http://codethought.com/blog/?p=233

+0

el enlace ya no funciona. – rasata

3

Gracias esto funciona muy bien: http://wiki.oneswarm.org/index.php/OS_X_10.6_Snow_Leopard

Extrañamente, que debe seguir el cambio de nombre pasos en las instrucciones, donde modificas los enlaces simbólicos para 1.5 y 1.5.0 a la versión real de leopard Java 1.5. Si no lo haces y solo intentas ejecutar el binario java, obtienes un error de bus.

En cualquier caso, gracias a estos pasos ahora tengo un Java 5 JDK real para compilar y ejecutar en Eclipse, lo que me ahorra lotes de problemas. Por un lado, puedo encontrar y eliminar referencias a métodos solo de Java 1.6 al instante. Es genial.Antes, estos solo aparecían en QA, o incluso peor, cuando uno de los pocos clientes que todavía estaban en Java 5 intentaba ejecutar nuestro programa. Que era. Malo.

Por ello, "apoyo" JDK5 mientras que en realidad sólo enlaces simbólicos apuntando a Java 6 no es lo suficientemente bueno para el desarrollo.

7

En realidad, hay dos problemas:

  1. Instalación de una versión antigua de Java, y mantenimiento de Actualización de Software en la eliminación de la misma.
  2. Telling aplicaciones que requieren la versión anterior dónde encontrarlo, mientras que dejar todo lo demás en beneficio de la versión más reciente.

no tengo nada que añadir (aún) a lo que ya se ha escrito sobre la instalación de una versión antigua de Java, sin embargo, according to this post from Mike Swingler, Ingeniero de ejecución de Java en Apple:

Nadie puede o debe debe cambiar enlaces simbólicos en/System/Library/Frameworks/JavaVM.framework a excepción de las actualizaciones de software de Apple (y estamos reacios a hacerlo, porque inevitablemente interrumpe a alguien)

En otras palabras, actualizando los enlaces del sistema operativo al la antigua copia de Java es una práctica cuestionable, ya que obliga a todas las aplicaciones Java en t el sistema para usar la versión anterior de Java.

La forma correcta es establecer JAVA_HOME a la versión correcta de Java en una medida que sea necesario. Puede hacerlo ejecutando /usr/libexec/java_home para obtener la ruta a una versión específica. Por ejemplo, para obtener la ruta a una versión 1.5:

/usr/libexec/java_home --version 1.5