Jak określić wersję JDK?
1) <java.version>
nie ma odniesienia w dokumentacji Mavena.
Jest to specyfika Spring Boot.
Pozwala na ustawienie źródłowej i docelowej wersji Java z tą samą wersją, taką jak ta, aby określić java 1.8 dla obu:
<properties>
<java.version>1.8</java.version>
</properties>
Nie krępuj się go używać, jeśli używasz Spring Boot.
2) Użycie maven-compiler-plugin
lub maven.compiler.source
/ maven.compiler.target
properties do określenia source
i target
są równoważne.
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
i
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
są równoważne zgodnie z dokumentacją Maven wtyczki kompilatora
Ponieważ <source>
oraz <target>
elementy do wykorzystania konfiguracji kompilator właściwości maven.compiler.source
i maven.compiler.target
jeśli są zdefiniowane.
źródło
-source
Argumentem dla kompilatora Javy.
Domyślna wartość to: 1.6
.
Użytkownik nie jest właściwość: maven.compiler.source
.
cel
-target
Argumentem dla kompilatora Javy.
Domyślna wartość to: 1.6
.
Użytkownik nie jest właściwość: maven.compiler.target
.
Jeśli chodzi o wartości domyślne dla source
i target
, zwróć uwagę, że
od czasu 3.8.0
kompilacji Maven wartości domyślne zmieniły się z 1.5
na1.6
.
3) Wtyczka maven-compiler-plugin 3.6
i nowsze wersje zapewniają nowy sposób:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<release>9</release>
</configuration>
</plugin>
Możesz również zadeklarować tylko:
<properties>
<maven.compiler.release>9</maven.compiler.release>
</properties>
Ale w tej chwili nie będzie działać jako maven-compiler-plugin
domyślna wersja, której używasz, nie zależy od wystarczająco aktualnej wersji.
release
Argument Maven przekazuje release
: nową standardową opcję JVM, którą możemy przekazać z Javy 9:
Kompiluje względem publicznego, obsługiwanego i udokumentowanego interfejsu API dla określonej wersji maszyny wirtualnej.
W ten sposób zapewnia standardowy sposób określenia tej samej wersji dla opcji source
, the target
i bootstrap
JVM.
Zwróć uwagę, że określenie the bootstrap
jest dobrą praktyką w przypadku kompilacji krzyżowych i nie zaszkodzi, jeśli nie wykonasz kompilacji krzyżowych.
Jaki jest najlepszy sposób określenia wersji JDK?
Pierwszy sposób ( <java.version>
) jest dozwolony tylko wtedy, gdy używasz Spring Boot.
Dla Java 8 i starszych:
O dwóch innych sposobach: wycenianie maven.compiler.source
/ maven.compiler.target
properties lub używaniemaven-compiler-plugin
, możesz użyć jednego lub drugiego. Nic to nie zmienia w faktach, ponieważ ostatecznie oba rozwiązania opierają się na tych samych właściwościach i tym samym mechanizmie: wtyczce kompilatora maven core.
Cóż, jeśli nie musisz określać innych właściwości lub zachowania niż wersje Java we wtyczce kompilatora, użycie tego sposobu ma więcej sensu, ponieważ jest bardziej zwięzłe:
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
Z Java 9:
release
Argument (trzeci punkt) jest sposobem, aby poważnie rozważyć, jeśli chcesz używać tej samej wersji dla źródła i celu.
Co się stanie, jeśli wersja różni się między JDK w JAVA_HOME a wersją określoną w pom.xml?
Nie stanowi problemu, jeśli zestaw JDK, do którego odwołuje się plik, JAVA_HOME
jest zgodny z wersją określoną w pliku pom, ale aby zapewnić lepszą kompatybilność między kompilacjami, pomyśl o dodaniu bootstrap
opcji JVM z wartością jako ścieżką rt.jar
do target
wersji.
Ważną rzeczą do rozważenia jest to, że source
i target
wersja w konfiguracji Maven nie powinna być wyższa od wersji JDK odwołuje się JAVA_HOME
.
Starsza wersja JDK nie może skompilować się z nowszą wersją, ponieważ nie zna swojej specyfikacji.
Aby uzyskać informacje na temat wersji źródłowej, docelowej i obsługiwanej wersji zgodnie z używanym pakietem JDK, zapoznaj się z kompilacją java: obsługiwane wersje źródłowe, docelowe i wydania .
Jak obsłużyć przypadek JDK, do którego odwołuje się JAVA_HOME, nie jest zgodny z docelową wersją java i / lub wersją źródłową określoną w pom?
Na przykład, jeśli JAVA_HOME
odwołujesz się do JDK 1.7 i określisz JDK 1.8 jako źródło i cel w konfiguracji kompilatora pom.xml, będzie to problem, ponieważ jak wyjaśniono, JDK 1.7 nie wie, jak się skompilować z .
Z jego punktu widzenia jest to nieznana wersja JDK od czasu jej wydania.
W takim przypadku należy skonfigurować wtyczkę kompilatora Maven, aby określić JDK w następujący sposób:
<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>
Możesz mieć więcej szczegółów w przykładach z wtyczką kompilatora maven .
Nie jest to wymagane, ale przypadki, w których może to być bardziej skomplikowane, to określenie źródła, ale nie celu. Może używać innej wersji w miejscu docelowym w zależności od wersji źródłowej. Reguły są szczególne: możesz o nich przeczytać w części Opcje krzyżowej kompilacji .
Dlaczego wtyczka kompilatora jest śledzona w danych wyjściowych podczas wykonywania celu Maven, package
nawet jeśli nie określisz go w pom.xml?
Aby skompilować kod, a bardziej ogólnie, aby wykonać wszystkie zadania wymagane do osiągnięcia celu maven, Maven potrzebuje narzędzi. Tak, że używa podstawowych wtyczek Maven (można rozpoznać rdzeń Maven plugin przez jej groupId
: org.apache.maven.plugins
) wykonać wymagane zadania: wtyczki kompilatora do kompilowania klas, test plugin do wykonywania testów, a więc dla ... więc, nawet jeśli nie zadeklaruj te wtyczki, są one związane z wykonaniem cyklu życia Mavena.
W katalogu głównym projektu Maven możesz uruchomić polecenie: mvn help:effective-pom
aby efektywnie wykorzystać ostateczny pom. Możesz zobaczyć między innymi załączone wtyczki Mavena (określone lub nie w pom.xml), z używaną wersją, ich konfiguracją i realizowanymi celami dla każdej fazy cyklu życia.
Na wyjściu mvn help:effective-pom
polecenia można zobaczyć deklarację tych podstawowych wtyczek w <build><plugins>
elemencie, na przykład:
...
<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>
...
Więcej informacji na ten temat można znaleźć we wprowadzeniu do cyklu życia Mavena w dokumentacji Mavena .
Niemniej jednak, możesz zadeklarować te wtyczki, gdy chcesz skonfigurować je z innymi wartościami jako wartościami domyślnymi (na przykład zrobiłeś to, gdy zadeklarowałeś wtyczkę maven-kompilator w swoim pom.xml, aby dostosować wersję JDK do użycia) lub gdy chcesz dodać kilka wykonań wtyczek, które nie są używane domyślnie w cyklu życia Mavena.
<maven.compiler.x>
od teraz trzymać się tej właściwości.