Il y a 3 ans -
Temps de lecture 5 minutes
Pépite : activer les fonctionnalités preview de Java dans un projet Maven
Introduction
Dans le cadre de mes essais des nouvelles fonctionnalités de Java (tel que les records ou les classes scellées), il m’a été nécessaire de devoir activer les fonctionnalités disponibles en avant-première via l’option --enable-preview
lors de la compilation et de l’exécution.
Le but de cet article est de montrer comment il est possible d’avoir accès aux fonctionnalités en avant-première de Java dans un projet Maven.
Deux remarques avant de commencer :
- L’option
--enable-preview
existe dans un but pour rendre accessible de nouvelles fonctionnalités qui ne sont pas forcément finalisées. Elles peuvent fortement évoluer entre deux versions de Java, tant qu’elles restent classées preview, selon les retours des utilisateurs. Je ne recommande donc pas d’utiliser en production mais seulement dans un cadre de test. - Cet article n’a pas vocation à être exhaustif et peut donc manquer des cas de figure particulier. Je tente de présenter les besoins qui me semble les plus courants.
Compilation
Tout d’abord voici un exemple de compilation de code Java « à la main » avec les fonctionnalités en avant-première :
javac --release 14 --enable-preview Point.java
Il est nécessaire de préciser la version du JDK utilisée (via l’option --release
, qui combine, depuis Java 9, les options --target
et --source
) pour la compilation lors de l’utilisation de l’option --enable-preview
.
Lorsqu’on souhaite faire la même chose sur un projet Maven, il faut :
- Rajouter la propriété
maven.compiler.release
en lui donnant la version de Java utilisée (14, 15, …) - Dans la configuration du plugin
org.apache.maven.plugins:maven-compiler-plugin
le champcompilerArgs
avec la valeur--enable-preview
Ce qui donne par exemple :
<project xmlns="<http://maven.apache.org/POM/4.0.0>" xmlns:xsi="<http://www.w3.org/2001/XMLSchema-instance>" xsi:schemaLocation="<http://maven.apache.org/POM/4.0.0> <http://maven.apache.org/maven-v4_0_0.xsd>"> <modelVersion>4.0.0</modelVersion> <groupId>xyz.coincoin.amber</groupId> <artifactId>sealed-classes</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>sealed-classes</name> <properties> <maven.compiler.release>15</maven.compiler.release> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> [...] </properties> [...] <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <compilerArgs>--enable-preview</compilerArgs> </configuration> </plugin> </plugins> </build> </project>
Exécutions des tests
Pour l’exécutions des tests unitaire via org.apache.maven.plugins:maven-surefire-plugin
et des tests d’intégrations (ou assimilés) via org.apache.maven.plugins:maven-failsafe-plugin
, il existe deux solutions :
- Via l’ajout dans la configuration des deux plugins le champ
argLine
avec la valeur--enable-preview
- Via l’ajout de la propriété
argLine
avec la valeur--enable-preview
Exécution de code
Si vous souhaiter configurer l’exécution de code via le goal exec:java
disponible avec le plugin org.codehaus.mojo:exec-maven-plugin
, vous avez deux options :
- Préciser dans la variable d’environnement
MAVEN_OPTS
la valeur--enable-preview
. Ce qui donneraitMAVEN_OPTS="--enable-preview" mvn exec:java
- D’utiliser le maven wrapper et d’ajouter la ligne
--enable-preview
dans le fichier.mvn/jvm.config
Exécution d’un projet Spring Boot
Voici un exemple de fichier pom.xml
d’un projet Spring Boot sous Java 14 ayants les fonctionnalités en avant-première d’activées :
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="<http://maven.apache.org/POM/4.0.0>" xmlns:xsi="<http://www.w3.org/2001/XMLSchema-instance>" xsi:schemaLocation="<http://maven.apache.org/POM/4.0.0> <https://maven.apache.org/xsd/maven-4.0.0.xsd>"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.2.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>demo</name> <description>Demo project for Spring Boot</description> <properties> <java.version>14</java.version> <argLine>--enable-preview</argLine> <spring-boot.run.jvmArguments>--enable-preview</spring-boot.run.jvmArguments> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <compilerArgs>--enable-preview</compilerArgs> </configuration> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
Quelques remarques :
- La propriété
java.version
remplace, dans ce contexte, la propriétémaven.compiler.release
- La propriété
spring-boot.run.jvmArguments
peut être remplacée par l’ajout dans la configuration du pluginorg.springframework.boot:spring-boot-maven-plugin
le champjvmArgments
avec la valeur--enable-preview
Conclusion
Cet article a permis de montrer comment activer les fonctionnalités en avant-première via Maven dans certaines situations et j’espère que cet article vous donnera suffisamment d’information pour s’adapter à vos besoins.
Commentaire