Як вказати версію JDK?
1) <java.version>
не посилається на документацію Maven.
Це специфіка весняного завантаження.
Це дозволяє встановити вихідну та цільову версію Java з тією ж версією, як ця, щоб вказати java 1.8 для обох:
<properties>
<java.version>1.8</java.version>
</properties>
Сміливо використовуйте його, якщо ви використовуєте Spring Boot.
2) Використання maven-compiler-plugin
або maven.compiler.source
/ maven.compiler.target
властивості для вказівки source
і target
еквівалентні.
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
і
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
еквівалентні згідно з документацією Maven на плагіні компілятора,
оскільки елементи <source>
та <target>
елементи конфігурації компілятора використовують властивості maven.compiler.source
та maven.compiler.target
якщо вони визначені.
джерело
-source
Аргумент для компілятора Java.
За замовчуванням значення: 1.6
.
Користувач: maven.compiler.source
.
цільовий
-target
Аргумент для компілятора Java.
За замовчуванням значення: 1.6
.
Користувач: maven.compiler.target
.
Про значення за замовчуванням для source
та target
зауважте, що
з часу 3.8.0
компілятора maven значення за замовчуванням змінилися з 1.5
на1.6
.
3) Плагін Maven-компілятор 3.6
та новіші версії надають новий спосіб:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<release>9</release>
</configuration>
</plugin>
Ви також можете заявити лише:
<properties>
<maven.compiler.release>9</maven.compiler.release>
</properties>
Але maven-compiler-plugin
наразі це не працюватиме, оскільки використовувана вами версія за замовчуванням не покладається на досить нову версію.
У Maven release
аргумент транспортує release
: а новий JVM стандартний варіант , який ми могли б перейти від Java 9:
Компілюється проти загальнодоступного, підтримуваного та документованого API для певної версії VM.
Цей спосіб забезпечує стандартний спосіб вказати ту саму версію для параметрів source
, target
та bootstrap
JVM.
Зауважте, що вказати значення bootstrap
є хорошою практикою для крос-компіляцій, і це не зашкодить, якщо ви також не зробите крос-компіляції.
Який найкращий спосіб вказати версію JDK?
Перший спосіб ( <java.version>
) дозволений, лише якщо ви використовуєте Spring Boot.
Для Java 8 і нижче:
Про два інші способи: оцінюючи maven.compiler.source
/ maven.compiler.target
властивості або використовуючи maven-compiler-plugin
, ви можете використовувати той чи інший. Факти нічого не змінюють, оскільки, нарешті, два рішення покладаються на однакові властивості та однаковий механізм: плагін компілятора ядра Maven.
Ну, якщо вам не потрібно вказувати інші властивості або поведінку, ніж версії Java, у плагіні компілятора, використання цього способу має більше сенсу, оскільки це більш стисло:
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
З Java 9:
release
Аргумент (третій пункт) спосіб сильно розглянути , якщо ви хочете використовувати ту ж версію для джерела і цілі.
Що станеться, якщо версія відрізняється між JDK в JAVA_HOME і тією, яка вказана в pom.xml?
Це не проблема , якщо JDK посилається JAVA_HOME
сумісний з версією , зазначеної в ПОМ , а для забезпечення кращої сумісності крос-компіляції думати про додавання bootstrap
опції JVM з в якості значення стезю rt.jar
в target
версії.
Важливо врахувати, що версія source
та target
версія в конфігурації Maven не повинні перевершувати версію JDK, на яку посилається JAVA_HOME
.
Старіша версія JDK не може компілюватись із більш новою версією, оскільки не знає її специфікації.
Щоб отримати інформацію про джерело, ціль та випуск підтримуваних версій відповідно до використовуваних JDK, зверніться до компіляції Java: джерело, ціль та випущені підтримувані версії .
Як поводитись із випадком JDK, на який посилається JAVA_HOME, не сумісний із цільовою версією Java та / або вихідними версіями, вказаними у пам’яті?
Наприклад, якщо ви JAVA_HOME
посилаєтесь на JDK 1.7 і ви вказали JDK 1.8 як джерело та ціль у конфігурації компілятора вашого pom.xml, це буде проблемою, оскільки, як пояснено, JDK 1.7 не знає, як компілювати .
З його точки зору, це невідома версія JDK, оскільки вона вийшла після неї.
У цьому випадку слід налаштувати плагін компілятора Maven, щоб вказати JDK таким чином:
<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>
Ви можете отримати більше деталей у прикладах із плагіном компілятора Maven .
Це не запитується, але випадки, коли це може бути складніше, це коли ви вказуєте джерело, але не націляєте на нього. Він може використовувати іншу версію в цілі відповідно до вихідної версії. Правила є окремими: ви можете прочитати про них у частині "Перехресні компіляції" .
Чому плагін компілятора простежується у висновку при виконанні package
мети Maven, навіть якщо ви не вказали його у pom.xml?
Щоб скласти свій код і загалом виконати всі завдання, необхідні для досягнення мети Maven, Maven потребує інструментів. Таким чином, він використовує ядро плагін Maven (ви дізнаєтеся основний Maven плагін, його groupId
: org.apache.maven.plugins
) для виконання необхідних завдань: компілятор плагіна для компіляції класів, тест - плагіна для виконання тестів, і тому для ... Так що , навіть якщо ви цього не зробите оголосити ці плагіни, вони пов'язані з виконанням життєвого циклу Maven.
У кореневому режимі проекту Maven ви можете запустити команду: mvn help:effective-pom
ефективно використовувати остаточну пом. Ви можете побачити серед іншої інформації додані додатки Maven (вказані чи ні у вашому pom.xml) із використаною версією, їх конфігурацією та виконаними цілями для кожної фази життєвого циклу.
У висновку mvn help:effective-pom
команди можна побачити декларацію цих основних плагінів у <build><plugins>
елементі, наприклад:
...
<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>
...
Ви можете отримати додаткову інформацію про це у введенні життєвого циклу Мевена в документацію Maven .
Тим не менш, ви можете оголосити ці плагіни, коли ви хочете налаштувати їх з іншими значеннями як значення за замовчуванням (наприклад, ви це зробили, коли ви оголосили плагін maven-компілятора у своєму pom.xml для налаштування версії JDK для використання) або коли ви хочемо додати кілька виконань плагінів, які не використовуються за замовчуванням у життєвому циклі Maven.
<maven.compiler.x>
властивості.