Come specificare la versione JDK?
1) <java.version>
non è indicato nella documentazione di Maven.
È una specificità di Spring Boot.
Permette di impostare la versione java di origine e destinazione con la stessa versione come questa per specificare java 1.8 per entrambi:
<properties>
<java.version>1.8</java.version>
</properties>
Sentiti libero di usarlo se usi Spring Boot.
2) Usare maven-compiler-plugin
o maven.compiler.source
/ maven.compiler.target
properties per specificare source
e e target
sono equivalenti.
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
e
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
sono equivalenti secondo la documentazione Maven del plug-in del compilatore
poiché <source>
gli <target>
elementi e nella configurazione del compilatore usano le proprietà maven.compiler.source
e maven.compiler.target
se sono definiti.
fonte
L' -source
argomento per il compilatore Java.
Il valore di default è: 1.6
.
Proprietà utente è: maven.compiler.source
.
bersaglio
L' -target
argomento per il compilatore Java.
Il valore di default è: 1.6
.
Proprietà utente è: maven.compiler.target
.
Informazioni sui valori predefiniti per source
e target
, si noti che
dal 3.8.0
compilatore del maven, i valori predefiniti sono cambiati da 1.5
a1.6
.
3) Maven-compilatore-plugin 3.6
e versioni successive forniscono un nuovo modo:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<release>9</release>
</configuration>
</plugin>
Puoi anche dichiarare solo:
<properties>
<maven.compiler.release>9</maven.compiler.release>
</properties>
Ma in questo momento non funzionerà poiché la maven-compiler-plugin
versione predefinita che usi non si basa su una versione abbastanza recente.
L' release
argomento Maven trasmette release
: una nuova opzione standard JVM che potremmo passare da Java 9:
Compila contro l'API pubblica, supportata e documentata per una versione specifica della VM.
In questo modo viene fornito un modo standard per specificare la stessa versione per le opzioni source
, the target
e bootstrap
JVM.
Si noti che specificare bootstrap
è una buona pratica per compilazioni incrociate e non farà male se non si effettuano compilazioni incrociate.
Qual è il modo migliore per specificare la versione JDK?
Il primo modo ( <java.version>
) è consentito solo se si utilizza Spring Boot.
Per Java 8 e versioni precedenti:
Per gli altri due modi: valutando le proprietà maven.compiler.source
/ o usando , puoi usare l'una o l'altra. Non cambia nulla nei fatti poiché alla fine le due soluzioni si basano sulle stesse proprietà e sullo stesso meccanismo: il plug-in del compilatore core maven. maven.compiler.target
maven-compiler-plugin
Bene, se non è necessario specificare altre proprietà o comportamenti rispetto alle versioni Java nel plug-in del compilatore, l'utilizzo in questo modo ha più senso in quanto è più conciso:
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
Da Java 9:
L' release
argomento (terzo punto) è un modo di considerare fortemente se si desidera utilizzare la stessa versione per l'origine e la destinazione.
Cosa succede se la versione differisce tra il JDK in JAVA_HOME e quello specificato in pom.xml?
Non è un problema se il JDK riferimento la JAVA_HOME
è compatibile con la versione specificata nel pom ma per garantire una migliore compatibilità cross-compilazione pensare aggiungendo l' bootstrap
opzione JVM con come valore il percorso della rt.jar
della target
versione.
Una cosa importante da considerare è che la source
e la target
versione nella configurazione di Maven non deve essere superiore alla versione JDK riferimento il JAVA_HOME
.
Una versione precedente di JDK non può essere compilata con una versione più recente poiché non conosce le sue specifiche.
Per ottenere informazioni sull'origine, destinazione e rilascio delle versioni supportate in base al JDK utilizzato, fare riferimento alla compilazione java: origine, destinazione e rilascio versioni supportate .
In che modo gestire il caso di JDK a cui fa riferimento JAVA_HOME non è compatibile con la destinazione java e / o le versioni di origine specificate nel pom?
Ad esempio, se si JAVA_HOME
fa riferimento a un JDK 1.7 e si specifica un JDK 1.8 come sorgente e destinazione nella configurazione del compilatore di pom.xml, sarà un problema perché, come spiegato, il JDK 1.7 non sa come compilare .
Dal suo punto di vista, è una versione JDK sconosciuta da quando è stata rilasciata dopo di essa.
In questo caso, è necessario configurare il plug-in del compilatore Maven per specificare il JDK in questo modo:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<compilerVersion>1.8</compilerVersion>
<fork>true</fork>
<executable>D:\jdk1.8\bin\javac</executable>
</configuration>
</plugin>
Potresti avere maggiori dettagli negli esempi con il plugin del compilatore di Maven .
Non viene richiesto, ma i casi in cui ciò può essere più complicato è quando si specifica l'origine ma non il target. Potrebbe utilizzare una versione diversa nella destinazione in base alla versione di origine. Le regole sono particolari: puoi leggerne nella sezione Opzioni di compilazione incrociata .
Perché il plug-in del compilatore viene tracciato nell'output durante l'esecuzione package
dell'obiettivo Maven anche se non lo si specifica in pom.xml?
Per compilare il codice e più in generale per eseguire tutte le attività necessarie per un obiettivo maven, Maven ha bisogno di strumenti. Quindi, utilizza plugin core Maven (si riconosce un nucleo Maven plug-in per la sua groupId
: org.apache.maven.plugins
) per fare i compiti richiesti: plug-in compilatore per le classi di compilazione, plug-in di prova per l'esecuzione di test, e quindi per ... Così, anche se non lo fai dichiarare questi plugin, sono legati all'esecuzione del ciclo di vita di Maven.
Alla directory principale del progetto Maven, è possibile eseguire il comando: mvn help:effective-pom
per utilizzare efficacemente l'ultimo pom. Potresti vedere, tra le altre informazioni, i plugin allegati di Maven (specificati o meno nel tuo pom.xml), con la versione utilizzata, la loro configurazione e gli obiettivi eseguiti per ogni fase del ciclo di vita.
Nell'output del mvn help:effective-pom
comando, è possibile visualizzare la dichiarazione di questi plug-in core <build><plugins>
nell'elemento, ad esempio:
...
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>2.5</version>
<executions>
<execution>
<id>default-clean</id>
<phase>clean</phase>
<goals>
<goal>clean</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<id>default-testResources</id>
<phase>process-test-resources</phase>
<goals>
<goal>testResources</goal>
</goals>
</execution>
<execution>
<id>default-resources</id>
<phase>process-resources</phase>
<goals>
<goal>resources</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<executions>
<execution>
<id>default-compile</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>default-testCompile</id>
<phase>test-compile</phase>
<goals>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>
...
Puoi avere maggiori informazioni a riguardo nell'introduzione del salvagente Maven nella documentazione di Maven .
Tuttavia, puoi dichiarare questi plugin quando vuoi configurarli con altri valori come valori predefiniti (ad esempio, l'hai fatto quando hai dichiarato il plugin del compilatore maven nel tuo pom.xml per regolare la versione JDK da usare) o quando desidera aggiungere alcune esecuzioni di plug-in non utilizzate per impostazione predefinita nel ciclo di vita di Maven.
<maven.compiler.x>
proprietà.