2012-04-11 11 views
23

Dado que el público Java 6 SE JRE se está acercando a su EOL (Nov '12), estoy considerando transferir mis proyectos de Java 6 a Java 7. Esto no sería un gran problema, si Apple proporcionara un Java 7 JRE para Mac OS X. Pero como Apple no está dispuesto a hacerlo, todavía tengo que dar soporte a usuarios que solo tienen Java JRE.¿Es posible compilar archivos de clase con Java 7 SDK que se puede ejecutar en JVM Java 6?

¿Existe alguna manera de compilar los binarios compatibles con Java 6 (archivos de clase) con Java 7 javac? Ciertamente, soy consciente de que no puedo usar las nuevas características de Java 7 al hacerlo.

Gracias en anticipción!

+1

Relacionados: http://stackoverflow.com/questions/4061965/if-i-compiled-a-java-file-in-the-newest-jdk-would-an-older-jvm-be-able-to -run-t – assylias

+0

posible duplicado de [Set ant bootclasspath: JDK 1.7 tiene una nueva advertencia javac para establecer una fuente anterior sin bootclasspath] (http://stackoverflow.com/questions/7260697/set-ant-bootclasspath-jdk-1 -7-has-a-new-javac-warning-for-setting-a-older-sour) –

+0

Duplicado de http://stackoverflow.com/questions/7661980/compiling-java-7-to-java-6 – karmakaze

Respuesta

21

Depende. Si su programa no utiliza las nuevas extensiones de lenguaje Java 7, puede ejecutar el compilador Java con las opciones -source 1.6 y -target 1.6. Pero si usa extensiones de lenguaje Java 7, entonces -source 1.6 dará como resultado errores de compilación.

Ciertamente soy consciente de que no puedo usar las nuevas funciones de Java 7 al hacerlo.

Eso incluye las características del lenguaje Java 7 ... y las dependencias en Java 7 cambian a las API de la biblioteca de clase estándar. También tenga en cuenta que existen pequeñas diferencias de comportamiento (también conocidas como correcciones de errores API) que pueden hacer que el código se ejecute de manera diferente en Java 6 y Java 7. Se deben describir en el documento de transición de Java 6 a Java 7.


ACTUALIZACIÓN - Probablemente esto ya no es un problema para usted de todos modos, ya que Oracle ha lanzado Java 7 para Mac OSX.

+0

Si sigues recibiendo errores con esto, puedes cambiar temporalmente a Java 6. Encuentra la ruta ejecutando '/ usr/libexec/java_home -v '1.6 *''. Luego, configúrelo como la ruta principal de Java usando 'export JAVA_HOME ="/path/to/java6/"'. Verifique que funcionó ejecutando 'java -version'. – user2398029

+0

@louism - En la configuración de Windows y Linux (al menos) JAVA_HOME no afecta directamente qué comando se ejecuta cuando ejecuta 'java'. ¿Mac OSX es diferente? –

+0

¡Parece que sí! Ver gist.github.com/4394202. – user2398029

5

tengo jdk6 instalado. si comprueba la página man de javac:

Cross-Compilation Options 
      By default, classes are compiled against the bootstrap and extension classes of the platform that javac shipped with. But javac also supports cross-compil‐ 
      ing, where classes are compiled against a bootstrap and extension classes of a different Java platform implementation. It is important to use -bootclasspath 
      and -extdirs when cross-compiling; see Cross-Compilation Example below. 

     -target version 
      Generate class files that target a specified version of the VM. Class files will run on the specified target and on later versions, but not on earlier 
      versions of the VM. Valid targets are 1.1 1.2 1.3 1.4 1.5 (also 5) and 1.6 (also 6). 
3

Sí, pero en algunos casos no. En java 1.6 no tuvieron la oportunidad de probar con los recursos, cambiar con cadenas o declaraciones de captura múltiple, etc. Por lo tanto, esas partes del programa no se compilarán. Pero la idea de Java es compilar una vez, ejecutar en todas partes; para que el código pueda funcionar en las JVM antiguas

3

La respuesta de Stephen C es correcta, pero no está completa. Sus programas Java 7 no se compilarán en Java 6 si usan características del lenguaje Java 7, pero se advirtió que aún pueden ocurrir otros bugs con una codificación de desarrollador en Java 6 y otra compilando Java 7.

Tome por ejemplo java. sql.Driver. En Java 7, la interfaz ganó un método adicional.

Desarrollador Java 7 Este desarrollador implementa la interfaz del controlador y utiliza la anotación 'Anular' en el método de controlador adicional implementado. El programa compila bien como un programa de Java 6 porque la clase que ve el compilador de Java 6 tiene ese método y el código se comprueba. Compilar el programa como Java 6 no significa que el compilador de Java 6 cambie automáticamente al uso de la fuente Java 6 ¡código!

Java 6 desarrollador El desarrollador de Java 6 intenta construir el código del desarrollador de Java 7 comprometida y obtiene un error de compilación pesar de que el desarrollador de Java 7 no estaba aplicando ningún construcciones del lenguaje Java 7.

En consecuencia, aunque podría compilarlo como Java 6, recomendaría no hacerlo.

Cuestiones relacionadas