Fichiers JAR à versions multiples avec Maven

1. Introduction

L'une des nouvelles fonctionnalités que Java 9 nous apporte est la capacité de créer des JAR à plusieurs versions (MRJAR). Comme l'indique la proposition d'amélioration du JDK, cela nous permet d'avoir différentes versions spécifiques à une version Java d'une classe dans le même JAR.

Dans ce didacticiel, nous explorons comment configurer un fichier MRJAR à l'aide de Maven.

2. Maven

Maven est l'un des outils de construction les plus utilisés dans l'écosystème Java; l'une de ses capacités consiste à intégrer un projet dans un JAR.

Dans les sections suivantes, nous allons explorer comment l'utiliser pour créer un MRJAR à la place.

3. Exemple de projet

Commençons par un exemple de base.

Tout d'abord, nous allons définir une classe qui imprime la version Java actuellement utilisée; avant Java 9, l'une des approches que nous pouvions utiliser était la méthode System.getProperty :

public class DefaultVersion { public String version() { return System.getProperty("java.version"); } }

Désormais, à partir de Java 9, nous pouvons utiliser la nouvelle méthode de version de la classe Runtime :

public class DefaultVersion { public String version() { return Runtime.version().toString(); } }

Avec cette méthode, nous pouvons obtenir une instance de classe Runtime.Version qui nous donne des informations sur la JVM utilisée dans le nouveau format de schéma de chaîne de version.

De plus, ajoutons une classe App pour enregistrer la version:

public class App { private static final Logger logger = LoggerFactory.getLogger(App.class); public static void main(String[] args) { logger.info(String.format("Running on %s", new DefaultVersion().version())); } }

Enfin, plaçons chaque version de DefaultVersion dans sa propre structure de répertoire src / main :

├── pom.xml ├── src │   ├── main │   │   ├── java │   │   │   └── com │   │   │   └── baeldung │   │   │   └── multireleaseapp │   │   │   ├── DefaultVersion.java │   │   │   └── App.java │   │   └── java9 │   │   └── com │   │   └── baeldung │   │   └── multireleaseapp │   │   └── DefaultVersion.java 

4. Configuration

Pour configurer le MRJAR à partir des classes ci-dessus, nous devons utiliser deux plugins Maven: le plugin Compiler et le plugin JAR.

4.1. Plugin du compilateur Maven

Dans le plugin Maven Compiler, nous devons configurer une exécution pour chaque version Java que nous emballerons.

Dans ce cas, nous en ajoutons deux:

   org.apache.maven.plugins maven-compiler-plugin   compile-java-8  compile   1.8 1.8    compile-java-9 compile  compile   9  ${project.basedir}/src/main/java9  ${project.build.outputDirectory}/META-INF/versions/9      

Nous utiliserons la première exécution compile-java-8 pour compiler notre classe Java 8 et l' exécution compile-java-9 pour compiler notre classe Java 9.

Nous pouvons voir que il est nécessaire de configurer le compileSourceRoot et OutputDirectory balises avec les dossiers respectifs pour la version Java 9.

Cependant, à partir de maven-compiler-plugin 3.7.1, nous n'avons pas besoin de définir le répertoire de sortie manuellement. Au lieu de cela, tout ce que nous avons à faire est d'activer la propriété multiReleaseOutput :

 9  ${project.basedir}/src/main/java9  true 

Lorsqu'il est défini sur true , le plugin du compilateur déplace toutes les classes spécifiques à la version vers le répertoire META-INF / versions / $ {release} . Veuillez noter que nous devons définir ici la balise release sur la version Java souhaitée, sinon le plugin du compilateur échoue .

4.2. Plugin Maven JAR

Nous utilisons le plugin JAR pour définir l' entrée Multi-Release sur true dans notre fichier MANIFEST . Avec cette configuration, le runtime Java cherchera dans le dossier META-INF / versions de notre fichier JAR pour les classes spécifiques à la version; sinon, seules les classes de base sont utilisées.

Ajoutons la configuration maven-jar-plugin :

 org.apache.maven.plugins maven-jar-plugin 3.2.0    true    

5. Test

Il est temps de tester notre fichier JAR généré.

Lorsque nous exécutons avec Java 8, nous verrons la sortie suivante:

[main] INFO com.baeldung.multireleaseapp.App - Running on 1.8.0_252

Mais si nous exécutons avec Java 14, nous verrons:

[main] INFO com.baeldung.multireleaseapp.App - Running on 14.0.1+7

Comme nous pouvons le voir, il utilise maintenant le nouveau format de sortie. Notez que bien que notre MRJAR ait été construit avec Java 9, il est compatible avec plusieurs versions majeures de la plate-forme Java.

6. Conclusion

Dans ce bref tutoriel, nous avons vu comment configurer l'outil de construction Maven pour générer un MRJAR simple.

Comme toujours, le code complet présenté dans ce didacticiel est disponible à l'adresse over sur GitHub.