2011-10-21 31 views
13

Recientemente me mudé a Java 7 en uno de mis proyectos. Yo reclamo que se puede ejecutar en Java 1.5, simplemente porque no hay nada que confiar en que está en Java 6 o 7. Sin embargo, cuando la compilación de hoy me di cuenta de esto:¿La compilación para Java 1.5 en Java 1.7 aún funciona?

bootstrap class path not set in conjunction with -source 1.5 

Google ha encontrado poca información sobre esta advertencia. ¿Esto significa que no puede compilar a Java 1.5 desde Java 1.7?

+0

No estoy seguro sobre el mensaje de error, pero me gustaría tener pruebas unitarias que se ejecutan automáticamente en cada versión significativa (1.x) de Java que afirmo soportar. –

Respuesta

13

Este blog Oracle explica la advertencia:

http://blogs.oracle.com/darcy/entry/bootclasspath_older_source

La razón es, que si se equivoca al disponer rt.jar para la plataforma mayor, entonces:

Si el segundo paso no se toma, javac utilizará diligentemente las antiguas reglas de lenguaje combinadas con nuevas bibliotecas, lo que puede generar archivos de clase que no funcionan en th La plataforma más vieja ya que las referencias a métodos no existentes pueden ser incluidos.

6
  1. Será mejor que establezca -source y -target 1.5.

  2. Para estar realmente seguro de que no está incorporando accidentalmente dependencias en clases, métodos o campos más nuevos, use el complemento maven-animal-sniffer o algo similar.

+2

+1 porque nunca antes había oído hablar de maven-animal-sniffer y me gustaría haberlo hecho muchas veces. (Entornos de prueba de asignación universitaria que no se han actualizado en 10 años = argh.) – millimoose

+2

Creo que también se recomienda establecer '-target 1.5'. Creo que el número de versión del formato classfile se superó entre 1.5 y 1.6, por lo que una VM 1.5 podría no poder cargarlos. (Incluso si no, mejor prevenir que lamentar) – millimoose

+0

si se especifican '-source' y' -target', el compilador 1.7 solicita '-xbootclasspath', que representa el punto 2. –

12

¿Esto significa que no puede compilar Java 1.5 desde Java 1.7?

No, no lo hace. Significa que hay una manera correcta y una incorrecta de hacer esto ... y lo estás haciendo de la manera incorrecta.

La forma correcta de compilar para Java 1.5 en una aplicación Java JDK 1.7 es:

  • hacerse con una copia de la "rt.jar" de Java 1.5 y la puso en bootclasspath compilación.

  • Compilar con -source 1.5 y -target 1.5.

El mensaje de advertencia le indica que no ha hecho el primero de estos.


La forma en que se está construyendo en este momento está implícita utilizando la versión 1.7 de "rt.jar" para las API de tiempo de ejecución Java. ¡Este puede funcionar! (De hecho, debería funcionar suponiendo que no ha realizado ningún cambio en el código desde la última versión 1.5). Sin embargo, existe el riesgo de que accidentalmente introduzca dependencias en las clases o métodos agregados en Java 1.6 o 1.7. Eso daría como resultado errores de tiempo de ejecución cuando intente ejecutar su aplicación en Java 1.5.

2

--source 1.5 se asegurará de que los archivos fuente cumplan con las convenciones de Java 5. --target 1.5 se asegurará de que los archivos de clase generados cumplan con las convenciones de Java 5.Ninguno de estos le protegerá del uso de los métodos de biblioteca Java 6 o 7. Debes compilar contra el rt.jar apropiado usando --bootclasspath, o usar algo como el plugin sniffer de animales (si estás usando maven) que inspeccionará la firma de todo tipo y lo comparará con los perfiles publicados.

Con el plugin sniffer de animales, puede ser un placer, porque puede toparse con bibliotecas de terceros que usan API Java 6, lo que puede causar que su proceso de compilación falle dado que está procesando Java 5.

Cuestiones relacionadas