Maven compiler plugin
Qué es maven compiler plugin[editar]
maven compiler plugin es el plugin que viene con Maven para el compilado de nuestras clases Java.
Tiene dos goals
- compiler:compile para compilar los fuentes de nuestro proyecto
- compiler:testCompile para compilar los fuentes de test (JUnit habitualmente) de nuestro proyecto. Es necesario ejecutar previamente el comando compiler:compile
Habitualmente no llamaremos a estos goals directamente. El comando mvn compile los llama en el orden adecuado durante la compilación.
Default Source y Target de maven compiler plugin[editar]
Si tenemos una versión moderna de maven que venga con una versión moderna de maven-compiler-plugin. maven-compiler-plugin compila pidiendo que nuestros fuentes sean compatibles con java 1.8 y los .class generados serán compatibles con java 1.8.
Así que si quieres usar características más modernas del lenguaje Java, hay que cambiar la configuración de maven-compiler-plugin para que entienda características más modernas del lenguaje.
Cambiar source y target de Java[editar]
Para cambiar esta configuración, basta añadir las siguiente propiedades en nuestro fichero pom.xml.
<properties>
<!-- maven-compiler-plugin -->
<maven.compiler.target>17</maven.compiler.target>
<maven.compiler.source>17</maven.compiler.source>
</properties>
- source hará que no podamos usar en nuestros fuentes java características de los fuentes java 17 que no estuvieran en versiones anteriores.
- target hará que los .class compilados sean para runtime Java JRE versión 17 o superior.
Los posibles números de versión pueden ser
- De la 1.7 a la 1.9 podemos poner indistintamente 1.7 o sólo 7, etc.
- De la 11 en adelante hay que poner 11. No podemos poner 1.11
maven-compiler-plugin release version xx not supported[editar]
Ten en cuenta que no podemos poner una versión más moderna que la del JDK que estemos usando. Si tenemos JDK versión 11, no podemos poner source o target como Java 17. Maven utiliza la instalación de Java que tenga definida en la variable de entorno JAVA_HOME
.
En caso de usar una versión más antigua de Java que la del target, source o release, obtentríamos errores estilo maven-compiler-plugin release version 17 not supported o error: invalid target release: 17
Compatibilidad con versiones anteriores de Java[editar]
De igual forma que cambiamos estas propiedades para generar código de un Java más moderno, podríamos cambiarlas para hacer código compatible con Java más antiguos.
La versión 1.7 es la más antigua soportada. No podemos poner la 1.6 o anteriores.
Cambiar la versión de source o target no garantiza que los .class generados corran en un JRE antiguo, puesto que aunque los fuentes sean compatibles, pueden usar clases que no estuvieran en dicho runtime antiguo. Si quieres garantizar que pueda correr en un JRE anterior, debes usar la propiedad maven.compiler.release
<maven.compiler.release>8</maven.compiler.release>
Versión de maven-compiler-plugin[editar]
A veces la versión de Maven que tenemos no tiene la versión de maven-compiler-plugin más moderna. Para asegurarnos de tener una versión moderna de maven-compiler-plugin, tenemos dos opciones dentro de nuestro pom.xml. La primera indicar la versión en un <pluginManagment>
...
<build>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
</plugin>
...
</plugins>
</pluginManagement>
...
</build>
La segunda opción, muy parecida, sería la siguiente
<project>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
</plugin>
...
</plugins>
</build>
</project>
Si hacemos esto último, también podemos cambiar la versión de source y target de Java que queremos directamente configurando en maven-compiler-plugin
en vez de usar las properties
<project>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<source>17</source>
<target>17</target>
</configuration>
</plugin>
...
</plugins>
</build>
</project>
En mvnrepository siempre puedes consultar cual es la versión más moderna del plugin.