Как указать версию 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 - различия между свойствами и плагином компилятора