File JAR a più versioni con Maven

1. Introduzione

Una delle nuove funzionalità offerte da Java 9 è la capacità di creare JAR multi-rilascio (MRJAR). Come afferma la proposta di miglioramento JDK, questo ci consente di avere diverse versioni specifiche di Java di una classe nello stesso JAR.

In questo tutorial, esploriamo come configurare un file MRJAR utilizzando Maven.

2. Maven

Maven è uno degli strumenti di compilazione più utilizzati nell'ecosistema Java; una delle sue capacità è confezionare un progetto in un JAR.

Nelle sezioni seguenti, esploreremo come usarlo per creare invece un MRJAR.

3. Progetto di esempio

Cominciamo con un esempio di base.

Per prima cosa, definiremo una classe che stampa la versione di Java attualmente utilizzata; prima di Java 9, uno degli approcci che potevamo utilizzare era il metodo System.getProperty :

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

Ora, da Java 9 in poi, possiamo utilizzare il nuovo metodo di versione dalla classe Runtime :

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

Con questo metodo, possiamo ottenere un'istanza della classe Runtime.Version che ci fornisce informazioni sulla JVM utilizzata nel nuovo formato dello schema stringa di versione.

Inoltre, aggiungiamo una classe App per registrare la versione:

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())); } }

Infine, posizioniamo ogni versione di DefaultVersion nella propria struttura di directory src / main :

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

4. Configurazione

Per configurare MRJAR dalle classi precedenti, è necessario utilizzare due plug-in Maven: il plug-in del compilatore e il plug-in JAR.

4.1. Plugin del compilatore Maven

Nel plug-in del compilatore Maven, dobbiamo configurare un'esecuzione per ogni versione di Java che pacchetteremo.

In questo caso, aggiungiamo due:

   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      

Useremo la prima esecuzione compile-java-8 per compilare la nostra classe Java 8 e l' esecuzione compile-java-9 per compilare la nostra classe Java 9.

Possiamo vedere che è necessario configurare i tag compileSourceRoot e outputDirectory con le rispettive cartelle per la versione Java 9.

Tuttavia, a partire da maven-compiler-plugin 3.7.1, non è necessario impostare manualmente la directory di output. Invece, tutto ciò che dobbiamo fare è abilitare la proprietà multiReleaseOutput :

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

Quando è impostato su true , il plug-in del compilatore sposta tutte le classi specifiche del rilascio nella directory META-INF / versioni / $ {release} . Tieni presente che dobbiamo impostare il tag di rilascio sulla versione Java desiderata qui, altrimenti il ​​plug-in del compilatore fallisce .

4.2. Plugin JAR Maven

Usiamo il plugin JAR per impostare la voce Multi-Release su true nel nostro file MANIFEST . Con questa configurazione, il runtime Java cercherà all'interno della cartella META-INF / versioni del nostro file JAR per classi specifiche della versione; in caso contrario, vengono utilizzate solo le classi base.

Aggiungiamo la configurazione del plugin maven-jar :

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

5. Test

È ora di testare il nostro file JAR generato.

Quando eseguiamo con Java 8, vedremo il seguente output:

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

Ma se eseguiamo con Java 14, vedremo:

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

Come possiamo vedere, ora utilizza il nuovo formato di output. Si noti che, sebbene il nostro MRJAR sia stato creato con Java 9, è compatibile con più versioni principali della piattaforma Java.

6. Conclusione

In questo breve tutorial, abbiamo visto come configurare lo strumento di compilazione Maven per generare un semplice MRJAR.

Come sempre, il codice completo presentato in questo tutorial è disponibile su GitHub.