Как указать версию Java 11 в Spring/Spring Boot pom.xml?

Как правильно указать Java 11 в качестве версии, которая будет использоваться в файле pom.xml Spring (или Spring Boot)?

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

После Java 9 больше нет «1.xx». Всего 9, 10 и 11.

RKrum 31.01.2019 20:08

Приведенная вами конфигурация идеальна. Использование самого последнего плагина maven-compiler-plugin и использование <release>11</release>...

khmarbaise 31.01.2019 20:23
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
52
2
77 111
4
Перейти к ответу Данный вопрос помечен как решенный

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

Во-первых, это просто неправильно, потому что не существует версии JDK 1.11, кроме того, начиная с JDK9+, есть опция --release для компилятора, которая поддерживается плагином maven-compiler-plugin через <release>11</release>...

khmarbaise 31.01.2019 20:24

Я добавляю это как ответ, чтобы он мог быть полезен большему количеству людей:

Начиная с 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.

Ответ принят как подходящий

Короткий ответ:

Правильный способ - использовать следующие значения в <java.version> для разных версий Java:

  • Java 8: 1.8 или 8
  • Ява 9: 9
  • Ява 10: 10
  • Ява 11: 11
  • Ява 12: 12

Итак, для Java 11 это должно быть:

<properties>
   <java.version>11</java.version>
</properties>

However I'm not sure if Java 11 would be "1.11" (seems unlikely), and I've seen it specified as just "11" when using maven-compiler-plugin, however I'm not using the compiler plugin.

На самом деле, в конце он все еще использует maven-compiler-plugin для компиляции. Springboot просто настраивает свойство <java.version> таким образом, что, изменяя это значение, вы неявно меняете maven-compiler-plugin и <source/><target/> на то же значение, которое указано в <java.version>:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.0</version>
    <configuration>
        <source>11</source>  <!-- 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 являются свойство пользователя для параметров конфигурации <source> и <target>. Из-за поведения пользовательского свойства установка этих двух свойств в 11 означает установку следующего:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.0</version>
    <configuration>
        <source>11</source>   <!-- maven.compiler.source  -->
        <target>11</target> <!-- maven.compiler.target -->
    </configuration>
</plugin>

Из maven-compiler-pluginдокументы снова <source> и <target> являются аргументами -source и -target для компилятора Java (javac). Затем из документов javac мы видим, что эти два аргумента могут иметь следующие значения:

  • 1.6 : No language changes were introduced in Java SE 6. However, encoding errors in source files are now reported as errors instead of warnings as was done in earlier releases of Java Platform, Standard Edition.
  • 6 : Synonym for 1.6.
  • 1.7 : The compiler accepts code with features introduced in Java SE 7.
  • 7 : Synonym for 1.7.
  • 1.8 : The compiler accepts code with features introduced in Java SE 8.
  • 8 : Synonym for 1.8.
  • 9 : The compiler accepts code with features introduced in Java SE 9.
  • 10 : The compiler accepts code with features introduced in Java SE 10.
  • 11 : The compiler accepts code with features introduced in Java SE 11.
  • 12 : The compiler accepts code with features introduced in Java SE 12.

Следовательно, <java.version> должен быть установлен на 11 для Java 11.

Ага. Хорошее объяснение! Это делает все намного яснее. Спасибо.

Acapulco 01.02.2019 17:11

Рассмотрим некоторые проекты, если не большинство, в больших системах используют импорт bom с пружинной загрузкой вместо расширения его родителя. И импорт bom не импортирует ни свойства, ни версии плагинов.

Whimusical 01.12.2019 14:36

Если кто-то хочет указать Java 11 в качестве версии, которая будет использоваться в Spring (или Spring Boot) в проекте градиент, используйте либо 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 {

}

Поскольку это лучший результат поиска Google, мы очень признательны

Macindows 21.08.2021 12:51

Другие вопросы по теме