Saltar al contenido

Especificación de la versión de java en maven: diferencias entre las propiedades y el complemento del compilador

Solución:

¿Cómo especificar la versión de JDK?

Use cualquiera de estas tres formas: (1) Función Spring Boot, o use el complemento del compilador Maven con (2) source Y target o (3) con release.

Bota de primavera

  1. <java.version> no se hace referencia en la documentación de Maven.
    Es una especificidad de Spring Boot.
    Permite establecer la versión de Java de origen y de destino con la misma versión como esta para especificar java 1.8 para ambos:

    1.8

Siéntase libre de usarlo si usa Spring Boot.

maven-compiler-plugin con source Y target

  1. Utilizando maven-compiler-plugin o maven.compiler.source/maven.compiler.target las propiedades son equivalentes.

Eso es de hecho:

<plugins>
    <plugin>    
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
            <source>1.8</source>
            <target>1.8</target>
        </configuration>
    </plugin>
</plugins>

es equivalente a :

<properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>

de acuerdo con la documentación de Maven del complemento del compilador desde el <source> y el <target> elementos en la configuración del compilador usan las propiedades maven.compiler.source y maven.compiler.target si están definidos.

fuente

los -source argumento para el compilador de Java.
El valor predeterminado es: 1.6.
La propiedad del usuario es: maven.compiler.source.

objetivo

los -target argumento para el compilador de Java.
El valor predeterminado es: 1.6.
La propiedad del usuario es: maven.compiler.target.

Acerca de los valores predeterminados para source y target, tenga en cuenta que desde el 3.8.0 del compilador maven, los valores predeterminados han cambiado de 1.5 para 1.6.

maven-compiler-plugin con release en lugar de source Y target

  1. El complemento del compilador de maven 3.6 y las versiones posteriores proporcionan una nueva forma:

    org.apache.maven.plugins maven-compiler-plugin 3.8.0 9

También puede declarar solo:

<properties>
    <maven.compiler.release>9</maven.compiler.release>
</properties>

Pero en este momento no funcionará como maven-compiler-plugin La versión predeterminada que utiliza no depende de una versión lo suficientemente reciente.

El maven release el argumento transmite release : una nueva opción estándar de JVM que podríamos pasar de Java 9:

Compila contra la API pública, admitida y documentada para una versión de VM específica.

De esta forma proporciona una forma estándar de especificar la misma versión para el source, los target y el bootstrap Opciones de JVM.
Tenga en cuenta que especificar el bootstrap es una buena práctica para las compilaciones cruzadas y no vendrá mal si tampoco realiza compilaciones cruzadas.


¿Cuál es la mejor forma de especificar la versión de JDK?

La primera forma (<java.version>) solo está permitido si usa Spring Boot.

Para Java 8 y versiones anteriores:

Sobre las otras dos formas: valorar la maven.compiler.source/maven.compiler.target propiedades o utilizando el maven-compiler-plugin, puede utilizar uno u otro. No cambia nada en los hechos, ya que finalmente las dos soluciones se basan en las mismas propiedades y el mismo mecanismo: el complemento del compilador principal de maven.

Bueno, si no necesita especificar otras propiedades o comportamientos que las versiones de Java en el complemento del compilador, usar esta forma tiene más sentido ya que es más conciso:

<properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>

Desde Java 9:

los release El argumento (tercer punto) es una forma de considerar seriamente si desea utilizar la misma versión para el origen y el destino.

¿Qué sucede si la versión difiere entre el JDK en JAVA_HOME y cuál se especifica en el pom.xml?

No es un problema si el JDK al que hace referencia el JAVA_HOME es compatible con la versión especificada en el pom, pero para garantizar una mejor compatibilidad de compilación cruzada, piense en agregar el bootstrap Opción JVM con como valor la ruta del rt.jar de El target versión.

Una cosa importante a considerar es que el source y el target La versión en la configuración de Maven no debe ser superior a la versión JDK a la que hace referencia el JAVA_HOME.
Una versión anterior del JDK no se puede compilar con una versión más reciente ya que no conoce su especificación.

Para obtener información sobre las versiones compatibles de origen, destino y lanzamiento de acuerdo con el JDK utilizado, consulte la compilación de Java: versiones compatibles de origen, destino y lanzamiento.


¿Cómo manejar el caso de JDK al que hace referencia JAVA_HOME no es compatible con el destino de Java y / o las versiones de origen especificadas en el pom?

Por ejemplo, si tu JAVA_HOME se refiere a un JDK 1.7 y usted especifica un JDK 1.8 como fuente y destino en la configuración del compilador de su pom.xml, será un problema porque, como se explicó, el JDK 1.7 no sabe cómo compilar.
Desde su punto de vista, es una versión de JDK desconocida ya que fue lanzada después.
En este caso, debe configurar el complemento del compilador de Maven para especificar el JDK de esta manera:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <source>1.8</source>
        <target>1.8</target>
        <compilerVersion>1.8</compilerVersion>      
        <fork>true</fork>
        <executable>D:jdk1.8binjavac</executable>                
    </configuration>
</plugin>

Podría tener más detalles en ejemplos con el complemento del compilador maven.


No se pregunta, pero los casos en los que puede ser más complicado es cuando se especifica la fuente pero no el destino. Puede usar una versión diferente en el destino según la versión de origen. Las reglas son particulares: puede leer sobre ellas en la sección Opciones de compilación cruzada.


Por qué se rastrea el complemento del compilador en la salida durante la ejecución de Maven package objetivo incluso si no lo especifica en el pom.xml?

Para compilar su código y, en general, para realizar todas las tareas necesarias para un objetivo de maven, Maven necesita herramientas. Por lo tanto, utiliza complementos principales de Maven (reconoce un complemento principal de Maven por su groupId : org.apache.maven.plugins) para realizar las tareas requeridas: complemento de compilador para compilar clases, complemento de prueba para ejecutar pruebas, etc. Entonces, incluso si no declara estos complementos, están vinculados a la ejecución del ciclo de vida de Maven.
En el directorio raíz de su proyecto Maven, puede ejecutar el comando: mvn help:effective-pom para que el pom final se utilice de forma eficaz. Podrías ver entre otra información, plugins adjuntos por Maven (especificados o no en tu pom.xml), con la versión utilizada, su configuración y los objetivos ejecutados para cada fase del ciclo de vida.

En la salida de la mvn help:effective-pom comando, puede ver la declaración de estos complementos principales en el <build><plugins> elemento, por ejemplo:

...
<plugin>
   <artifactId>maven-clean-plugin</artifactId>
   <version>2.5</version>
   <executions>
     <execution>
       <id>default-clean</id>
       <phase>clean</phase>
       <goals>
         <goal>clean</goal>
       </goals>
     </execution>
   </executions>
 </plugin>
 <plugin>
   <artifactId>maven-resources-plugin</artifactId>
   <version>2.6</version>
   <executions>
     <execution>
       <id>default-testResources</id>
       <phase>process-test-resources</phase>
       <goals>
         <goal>testResources</goal>
       </goals>
     </execution>
     <execution>
       <id>default-resources</id>
       <phase>process-resources</phase>
       <goals>
         <goal>resources</goal>
       </goals>
     </execution>
   </executions>
 </plugin>
 <plugin>
   <artifactId>maven-compiler-plugin</artifactId>
   <version>3.1</version>
   <executions>
     <execution>
       <id>default-compile</id>
       <phase>compile</phase>
       <goals>
         <goal>compile</goal>
       </goals>
     </execution>
     <execution>
       <id>default-testCompile</id>
       <phase>test-compile</phase>
       <goals>
         <goal>testCompile</goal>
       </goals>
     </execution>
   </executions>
 </plugin>
  ...

Puede tener más información al respecto en la introducción del ciclo de vida de Maven en la documentación de Maven.

Sin embargo, puede declarar estos complementos cuando desee configurarlos con otros valores como valores predeterminados (por ejemplo, lo hizo cuando declaró el complemento del compilador maven en su pom.xml para ajustar la versión de JDK a usar) o cuando desea agregar algunas ejecuciones de complementos que no se utilizan de forma predeterminada en el ciclo de vida de Maven.

Ninguna de las soluciones anteriores funcionó para mí de inmediato. Entonces seguí estos pasos:

  1. Añadir pom.xml:
<properties>
    <maven.compiler.target>1.8</maven.compiler.target>
    <maven.compiler.source>1.8</maven.compiler.source>
</properties>
  1. Ir a Project Properties > Java Build Path, luego elimine la biblioteca del sistema JRE que apunta a JRE1.5.

  2. Force actualizó el proyecto.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *