tutorial run example compile java gradle compatibility bytecode

java - run - gradle tutorial



Gradle sourceCompatibility no tiene ningĂșn efecto en los subproyectos (3)

Tengo Java 6 y 7 instalados en mi máquina. Gradle usa 1.7 (comprobado usando gradle -v ). Pero necesito compilar mi código para que sea compatible con Java 1.6. Por lo que entiendo la documentación, puedo usar la propiedad sourceCompatibility para hacerlo (y de forma indirecta la targetCompatibility que por defecto es la sourceCompatibility ).

Así que agregué la siguiente línea a mi archivo de compilación (en el nivel raíz, no en ningún cierre):

sourceCompatibility = 1.6

(para asegurarse de que también agregué el targetCompatibility = 1.6 en algunos ensayos, pero eso no debería marcar la diferencia)

Para comprobar si el resultado era realmente compatible con 1.6, descomprimí el archivo jar resultante, lo cd en la carpeta WEB-INF/classes y usé javap -verbose en el primer archivo .class que encontré. Pero no importa si establezco la compatibilidad del objetivo o si utilicé 1.5 en lugar de 1.6 o si lo especifiqué como cadena ( ''1.6'' ), cada vez que el resultado de javap era

minor version: 0 major version: 51

Afaik esto significa que es Java 1.7 Bytecode, que es incorrecto.

¿Alguna idea de por qué el sourceCompatibility la sourceCompatibility no funciona? ¿O no es javap la forma correcta de verificar la compatibilidad?

ACTUALIZACIÓN: Sí, esta es una compilación de varios proyectos, pero solo revisé uno de los resultados de compilación de los subproyectos. En el archivo de compilación de este subproyecto realicé los cambios mencionados para asegurarme de que realmente se aplican. Además, agregué lo siguiente en el archivo de compilación del proyecto raíz (como también se propuso @Vidya):

allprojects { sourceCompatibility = 1.6 targetCompatibility = 1.6 }

Pero esto tampoco ayudó.

ACTUALIZACIÓN 2: Comprobé la configuración de sourceCompatibility con este fragmento en los archivos build.gradle relevantes:

compileJava.doFirst { println "source compatibility " + sourceCompatibility }

Reveló que mi sourceCompatibility está establecido en 1.7 aunque traté de establecerlo en 1.6. Cuando extraje el subproyecto más simple y lo construí por su cuenta, el sourceCompatibility está configurado correctamente y el código de Java Byte es compatible con el 1.6. Sin embargo, incluso este subproyecto utiliza la fuente de compatibilidad incorrecta cuando se utiliza en la creación de proyectos múltiples.

Por cierto: los complementos que uso en algunos de los subproyectos son: java , war , jetty , gwt

ACTUALIZACIÓN 3: Cambié las secuencias de comandos creadas para usar el plugin de Java (y así solo construir algunas jarras) y gwt el uso del plugin war , jetty y gwt . Pero todavía todos los proyectos están configurados en sourceCompatibility 1.7 a pesar de que lo configuro en la sección allprojects y en algunos de los subproyectos. Todo lo que queda ahora en los scripts de compilación es la declaración de algunas debilidades (maven, archivos y otros subproyectos), la declaración de los repositorios a usar, la declaración de algunas otras tareas (de las que no depende la tarea de compilación, por lo que no debería verse afectado) y la configuración del archivo de manifiesto para los archivos jar creados (agrego una especificación y una versión de implementación y título al archivo de manifiesto).

No veo cómo nada de eso afectaría la configuración de la fuente de compatibilidad.


Debe definir las tareas compileJava en el archivo build.gradle, si usa sourceCompatibility o targetCompatibility. Sin las tareas compileJava, ambas variables de compatibilidad se muestran como variables no utilizadas en Intellij. Estoy usando la versión 2.10 de Gradle.


Los síntomas indican que en algún lugar alguien sobrescribe project.sourceCompatibility . Pero dado que hay muchas formas de personalizar Gradle, no puedo decir a distancia quién es.

Como solución, puede establecer las propiedades en el nivel de la tarea, que es lo que finalmente cuenta:

tasks.withType(JavaCompile) { sourceCompatibility = "1.6" targetCompatibility = "1.6" }

Agregue esto al allProjects { ... } .


Parece que este comportamiento se debe a que especifica el apply plugin: ''java'' sourceCompatibility antes de apply plugin: ''java'' , que sucede si intentas establecer la opción de compatibilidad dentro de todos los allprojects .

En mi configuración, la situación se puede resolver reemplazando:

allprojects { sourceCompatibility = 1.6 targetCompatibility = 1.6 }

con:

allprojects { apply plugin: ''java'' sourceCompatibility = 1.6 targetCompatibility = 1.6 }

Estaré contento si alguien más puede verificar esto en una configuración diferente.

Todavía no estoy seguro de si esto debe ser informado como un error, pero creo que esta solución es mejor que la solución de problemas mencionada anteriormente (que ha sido muy útil, sin embargo).