JAR-bestanden met meerdere releases met Maven

1. Inleiding

Een van de nieuwe functies die Java 9 ons biedt, is de mogelijkheid om Multi-Release JAR's (MRJAR) te bouwen. Zoals het JDK Enhancement Proposal zegt, stelt dit ons in staat om verschillende Java-release-specifieke versies van een klasse in dezelfde JAR te hebben.

In deze zelfstudie onderzoeken we hoe u een MRJAR-bestand configureert met Maven.

2. Maven

Maven is een van de meest gebruikte build-tools in het Java-ecosysteem; een van de mogelijkheden is het verpakken van een project in een JAR.

In de volgende secties zullen we onderzoeken hoe we het kunnen gebruiken om in plaats daarvan een MRJAR te bouwen.

3. Voorbeeldproject

Laten we beginnen met een eenvoudig voorbeeld.

Eerst zullen we een klasse definiëren die de momenteel gebruikte Java-versie afdrukt; vóór Java 9 was een van de benaderingen die we konden gebruiken de System.getProperty methode:

openbare klasse DefaultVersion {openbare String-versie () {retourneer System.getProperty ("java.version"); }}

Nu, vanaf Java 9 en hoger, kunnen we het nieuwe versie methode van de Looptijd klasse:

openbare klasse DefaultVersion {openbare String-versie () {terugkeer Runtime.version (). toString (); }}

Met deze methode kunnen we een Runtime.Version class-instantie die ons informatie geeft over de JVM die wordt gebruikt in de nieuwe versie-string schema-indeling.

Plus, laten we een App klasse om de versie te loggen:

openbare klasse App {privé statische laatste Logger-logger = LoggerFactory.getLogger (App.class); public static void main (String [] args) {logger.info (String.format ("Draait op% s", nieuwe DefaultVersion (). version ())); }}

Laten we tot slot elke versie van DefaultVersion in zijn eigen src / main directory structuur:

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

4. Configuratie

Om de MRJAR uit de bovenstaande klassen te configureren, hebben we twee Maven-plug-ins nodig: de Compiler-plug-in en de JAR-plug-in.

4.1. Maven Compiler-plug-in

In de Maven Compiler-plug-in moeten we één uitvoering configureren voor elke Java-versie die we verpakken.

In dit geval voegen we er twee toe:

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

We gebruiken de eerste executie compileren-java-8 om onze Java 8-klasse en de compileren-java-9 uitvoering om onze Java 9-klasse te compileren.

Dat kunnen we zien het is nodig om het compileSourceRoot en outputDirectory tags met de respectievelijke mappen voor de Java 9-versie.

Vanaf maven-compiler-plugin 3.7.1, hoeven we de uitvoermap niet handmatig in te stellen. In plaats daarvan hoeven we alleen maar het multiReleaseOutput eigendom:

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

Indien ingesteld op waar, verplaatst de compiler-plug-in alle release-specifieke klassen naar de META-INF / versies / $ {release} directory. Houd er rekening mee dat we de vrijlating tag hier naar de gewenste Java-versie, anders mislukt de compiler-plug-in.

4.2. Maven JAR-plug-in

We gebruiken de JAR-plug-in om de Meerdere releases toegang tot waar in onze MANIFESTEREN het dossier. Met deze configuratie kijkt de Java-runtime in het META-INF / versies map van ons JAR-bestand voor versiespecifieke klassen; anders worden alleen de basisklassen gebruikt.

Laten we de maven-jar-plugin configuratie:

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

5. Testen

Het is tijd om ons gegenereerde JAR-bestand te testen.

Wanneer we uitvoeren met Java 8, zien we de volgende uitvoer:

[main] INFO com.baeldung.multireleaseapp.App - Draait op 1.8.0_252

Maar als we het uitvoeren met Java 14, zullen we zien:

[main] INFO com.baeldung.multireleaseapp.App - Draait op 14.0.1 + 7

Zoals we kunnen zien, gebruikt het nu het nieuwe uitvoerformaat. Merk op dat hoewel onze MRJAR is gebouwd met Java 9, deze compatibel is met meerdere belangrijke Java-platformversies.

6. Conclusie

In deze korte tutorial hebben we gezien hoe we de Maven-buildtool kunnen configureren om een ​​eenvoudige MRJAR te genereren.

Zoals altijd is de volledige code die in deze tutorial wordt gepresenteerd, beschikbaar op GitHub.