Cómo omitir tests en versiones específicas del JDK con Maven Compiler Plugin
Introducción
La cadencia de lanzamiento más rápida de Java ha hecho cada vez más común que los proyectos apunten a múltiples versiones de JDK simultáneamente. Además, un número creciente de dependencias requieren versiones de JDK más recientes y ya no admiten versiones anteriores.
Cuando se trata de dependencias de test, es común tener tests que solo se pueden ejecutar en versiones específicas de JDK. Para garantizar una compilación y ejecución de tests exitosa, puede ser necesario compilar y ejecutar tests sólo en las versiones de JDK con las que son compatibles.
Es posible que te sientas tentado a usar la anotación @DisabledForJreRange
de JUnit para omitir tests en versiones específicas de un JDK.
Sin embargo, este enfoque solo omite la ejecución de los tests y no la compilación de las clases de test.
Esto puede llevar a errores de compilación, especialmente cuando las clases de test dependen de APIs que no están disponibles en el JDK actual.
En esta publicación, te mostraré cómo configurar el Maven Compiler Plugin y tu proyecto Maven para compilar y ejecutar tests solo en versiones específicas de un JDK.
Configurando el Maven Compiler Plugin
El Maven Compiler Plugin permite un control detallado sobre el proceso de compilación, incluida la exclusión de archivos o directorios específicos.
Para omitir la compilación de clases de test en versiones específicas de JDK, puedes usar la opción de configuración testExcludes
.
Por ejemplo, la siguiente configuración excluirá todas las clases de test que tengan el sufijo LegacyTest
del proceso de compilación de tests:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<testExcludes>
<!-- Exclude test files with the suffix 'LegacyTest' -->
<testExclude>**/*LegacyTest.java</testExclude>
</testExcludes>
</configuration>
</plugin>
</plugins>
</build>
Excluyendo tests en versiones específicas de JDK
Podemos aprovechar los perfiles de Maven para realizar las exclusiones solo cuando ejecutamos Maven en versiones específicas de un JDK.
Mediante el uso del elemento activation
en combinación con la propiedad jdk
, podemos activar un perfil sólo cuando Maven se está ejecutando en una versión específica de un JDK.
Por ejemplo, la siguiente configuración excluirá todas las clases de test que tengan el sufijo LegacyTest
cuando Maven se esté ejecutando en Java 8:
<profiles>
<profile>
<id>exclude-legacy-tests</id>
<activation>
<jdk>1.8</jdk>
</activation>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<testExcludes>
<testExclude>**/*LegacyTest.java</testExclude>
</testExcludes>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
En el futuro, si necesitas excluir clases de test en JDK 11 o anteriores, puedes ajustar la propiedad jdk
a <jdk>(,11]</jdk>
.
Puedes ver un caso de uso real de esta configuración en el proyecto Eclipse JKube en el pom.xml.
Conclusión
En esta publicación, hemos visto cómo configurar el Maven Compiler Plugin para excluir clases de test del proceso de compilación en función de la versión del JDK.
Combinando perfiles de Maven con la propiedad jdk
, puedes excluir dinámicamente clases de test incompatibles, asegurando flujos de trabajo de compilación y testeo sin problemas.
Este patrón de configuración es flexible y se puede adaptar a varios escenarios, convirtiendo Maven en una herramienta poderosa para mantener la compatibilidad en diversos entornos.