Published by

Il y a 3 semaines -

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 champ compilerArgs 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 donnerait MAVEN_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 plugin org.springframework.boot:spring-boot-maven-plugin le champ jvmArgments 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.

Published by

Commentaire

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Nous recrutons

Être un Sapient, c'est faire partie d'un groupe de passionnés ; C'est l'opportunité de travailler et de partager avec des pairs parmi les plus talentueux.