Как указать версию Java 11 в Spring/Spring Boot pom.xml?
Как правильно указать Java 11 в качестве версии, которая будет использоваться в файле Spring (или Spring Boot) pom.xml?
Т.е. какое значение мне нужно указать в свойстве java.version
pom?
Для Java 8 мы используем 1.8
, так же как документация показывает, для Java 9 это 1.9
.
Я не уверен, что Java 11 будет 1.11
(хотя это кажется маловероятным), и я видел, что он указан как просто 11
при использовании maven-compiler-plugin
, однако я не использую плагин компилятора.
например
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<release>11</release>
</configuration>
</plugin>
Я искал и не мог найти ответ, так как почти любая прочитанная мною документация, а также сообщения в блогах, относящиеся к версии Java, показывают только версии 8 или 9.
Так что я должен использовать? 1.11
или просто 11
?
Я пробовал и то и другое, и мой веб-сервер, кажется, запускается правильно и компилируется правильно (IntelliJ показывает Information:javac 11.0.2 was used to compile java sources
), однако я не совсем убежден, что изменение значения java.version
делает что-либо, потому что я могу установить его, например, например. 100
и все работает отлично.
Единственные связанные вопросы, которые я мог найти: Минимальная версия Spring, совместимая с Java 11, Spring Boot не удается из-за ошибки Hibernate после перехода на JDK 11 и Spring 4.3.x с OpenJDK 11, но они действительно не проливают свет.
Ответы
Ответ 1
Краткий ответ:
Правильный способ - использовать следующие значения в <java.version>
для разных версий Java:
- Java 8: 1,8 или 8
- Java 9: 9
- Java 10: 10
- Java 11:11
- Java 12: 12
Так что для Java 11 это должно быть:
<properties>
<java.version>11</java.version>
</properties>
Однако я не уверен, что Java 11 будет "1.11" (кажется маловероятным), и Я видел это указано как "11" при использовании maven-compiler-plugin, однако я не использую плагин компилятора.
На самом деле, в конце он все еще использует maven-compiler-plugin
для компиляции. Springboot просто настраивает свойство <java.version>
таким образом, что, изменяя это значение, вы неявно меняете maven-compiler-plugin
<release/>
и <target/>
на то же значение, которое указано в <java.version>
:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<release>11</release> <!-- same as <java.version> -->
<target>11</target> <!-- same as <java.version> -->
</configuration>
</plugin>
Подробный ответ:
Похоже, вы хотите, чтобы детали убедили вас.
Это происходит потому, что каждый весенний загрузочный проект расширяет родительский pom spring-boot-starter-parent
, который определяет <java.version>
следующим образом:
<properties>
<java.version>1.8</java.version>
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
</properties>
Из плагина maven-compiler-plugin , документы, maven.compiler.source
и maven.compiler.target
являются пользовательским свойством для параметров конфигурации <release>
и <source>
. Поведение пользовательского свойства, установить эти два свойства на 11
означает установить следующее:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<release>11</release> <!-- maven.compiler.release -->
<source>11</source> <!-- maven.compiler.source -->
</configuration>
</plugin>
Из maven-compiler-plugin
документов снова <release>
и <source>
являются аргументами -release
и -source
для компилятора Java (javac
). Затем из javac документов мы видим, что этим двум аргументам разрешено иметь следующие значения:
-
1.6: В Java SE 6 не было внесено никаких изменений языка. Однако ошибки кодирования в исходных файлах теперь сообщаются как ошибки, а не как предупреждения, как это было сделано в более ранних выпусках Java Platform, Standard Edition.
- 6: Синоним для 1.6.
- 1.7. Компилятор принимает код с функциями, представленными в Java SE 7.
- 7: Синоним для 1.7.
- 1.8: компилятор принимает код с функциями, представленными в Java SE 8.
- 8: Синоним для 1.8.
- 9: компилятор принимает код с функциями, представленными в Java SE 9.
- 10: компилятор принимает код с функциями, представленными в Java SE 10.
- 11: компилятор принимает код с функциями, представленными в Java SE 11.
- 12: компилятор принимает код с функциями, представленными в Java SE 12.
Следовательно, <java.version>
должен быть установлен в 11
для Java 11.
Ответ 2
Я добавляю его в качестве ответа, чтобы он мог быть полезен большему количеству людей:
Начиная с Java 9 версии указываются как 9
, 10
, 11
и т.д. Вместо 1.8
, 1.7
и т.д. Некоторое дальнейшее чтение здесь.
То, как вы указываете версию JDK с помощью <release>11</release>
, является правильным. Он был введен с maven-compiler-plugin 3.6
и эквивалентен старому, как показано ниже:
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>11</source> -- Using JDK 11 to compile
<target>11</target> -- Using JDK 11 as target
</configuration>
</plugin>
</plugins>
Этот пост может быть полезен при использовании maven-compiler-plugin
с JDK 11.
Ответ 3
Если кто-то хочет указать Java 11 в качестве версии, которая будет использоваться в Spring (или Spring Boot) в gradle- проекте, то используйте либо sourceCompatibility = '11', либо sourceCompatibility = '1.11' в файле build.gradle
plugins {
id 'org.springframework.boot' version '2.1.4.RELEASE'
}
apply plugin: 'io.spring.dependency-management'
group = 'au.com.ranuka'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
//or
sourceCompatibility = '1.11'
repositories {
mavenCentral()
}
dependencies {
}
Ответ 4
Вам не нужно упоминать maven-compiler-plugin в вашем POM файле, если вы хотите указать только версию компилятора. Вместо этого добавьте эти свойства в ваш файл pom
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
Редактировать: мой плохой, похоже, что свойства номера версии изменились, начиная с версии 3.6 maven-compiler-plugin. Пример выше подходит для Java 8 и ниже. Для Java 9, добавьте это свойство:
<properties>
<maven.compiler.release>9</maven.compiler.release>
</properties>
Проверьте принятый ответ на этот вопрос: Указание версии Java в Maven - различия между свойствами и плагином компилятора