web-dev-qa-db-fra.com

Comment spécifier la version Java 11 dans Spring / Spring Boot pom.xml?

Quelle est la bonne façon de spécifier Java 11 comme version à utiliser dans le fichier pom.xml de Spring (ou Spring Boot)?

C'est-à-dire, quelle valeur dois-je mettre dans le Java.version propriété du pom?

Pour Java 8, nous utilisons 1.8, tout comme la documentation le montre , pour Java 9 c'est 1.9.

Je ne sais pas si Java 11 serait 1.11 (bien que cela semble peu probable), et je l'ai vu spécifié simplement comme 11 lors de l'utilisation de maven-compiler-plugin, mais je n'utilise pas le plugin du compilateur.

par exemple.

<plugin>
    <groupId>org.Apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.0</version>
    <configuration>
        <release>11</release>
    </configuration>
</plugin>

J'ai cherché autour et je n'ai pas trouvé la réponse, comme à peu près toute la documentation que j'ai lue ainsi que les articles de blog liés à la version Java affiche uniquement les versions 8 ou 9.

Alors, que dois-je utiliser? 1.11 ou juste 11?

J'ai essayé les deux et mon serveur Web semble démarrer correctement et compiler correctement (IntelliJ affiche Information:javac 11.0.2 was used to compile Java sources) mais je ne suis pas tout à fait convaincu que changer le Java.version la valeur fait n'importe quoi, car je peux la définir par exemple 100 et tout fonctionne bien.

Les seules questions connexes que j'ai pu trouver sont: Version Spring minimale compatible avec Java 11 , Spring Boot échoue en raison d'une erreur de mise en veille prolongée après la migration vers JDK 11 et Spring 4.3.x avec OpenJDK 11 , mais ils ne font pas vraiment la lumière.

18
Acapulco

Réponse courte:

La bonne façon est d'utiliser les valeurs suivantes dans <Java.version> pour différentes versions Java versions:

  • Java 8: 1.8 ou 8
  • Java 9: ​​9
  • Java 10: 10
  • Java 11: 11
  • Java 12: 12

Donc pour Java 11, cela devrait être:

<properties>
   <Java.version>11</Java.version>
</properties>

Cependant, je ne sais pas si Java 11 serait "1.11" (semble peu probable), et je l'ai vu spécifié comme étant simplement "11" lors de l'utilisation de maven-compiler-plugin, mais je n'utilise pas le plugin du compilateur.

En fait, à la fin, il utilise toujours maven-compiler-plugin compiler. Springboot configure simplement un <Java.version> propriété telle qu'en modifiant cette valeur, vous modifiez implicitement maven-compiler-plugin's <release/> et <target/> à la même valeur que celle spécifiée dans le <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>

Réponse détaillée:

On dirait que vous voulez des détails pour vous convaincre.

C'est parce que chaque projet de démarrage de printemps étendra le pom parent spring-boot-starter-parent qui définit<Java.version> comme suit:

<properties>
    <Java.version>1.8</Java.version>
    <maven.compiler.source>${Java.version}</maven.compiler.source>
    <maven.compiler.target>${Java.version}</maven.compiler.target>
</properties>

Depuis le plugin maven-compiler docs , maven.compiler.source et maven.compiler.target sont les propriété utilisateur pour les <release> et <source> paramètres de configuration. En raison du comportement de la propriété utilisateur, la définition de ces deux propriétés sur 11 signifie définir les éléments suivants:

<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>

Du maven-compiler-plugindocs à nouveau, <release> et <source> sont les -release et -source argument pour le Java (javac). Ensuite, à partir de javac docs, nous pouvons voir que ces deux arguments peuvent avoir le valeurs suivantes:

  • 1.6: Aucune modification de langue n'a été introduite dans Java SE 6. Cependant, les erreurs de codage dans les fichiers source sont désormais signalées comme des erreurs au lieu d'avertissements, comme c'était le cas dans les versions antérieures de Java Plate-forme, édition standard.
  • 6: Synonyme de 1.6.
  • 1.7: Le compilateur accepte du code avec des fonctionnalités introduites dans Java SE 7.
  • 7: Synonyme de 1.7.
  • 1.8: Le compilateur accepte du code avec des fonctionnalités introduites dans Java SE 8.
  • 8: Synonyme de 1.8.
  • 9: Le compilateur accepte du code avec des fonctionnalités introduites dans Java SE 9.
  • 10: Le compilateur accepte du code avec des fonctionnalités introduites dans Java SE 10.
  • 11: Le compilateur accepte du code avec des fonctionnalités introduites dans Java SE 11.
  • 12: Le compilateur accepte du code avec des fonctionnalités introduites dans Java SE 12.

Par conséquent, <Java.version> doit être défini sur 11 pour Java 11.

43
Ken Chan

Je l'ajoute comme réponse afin qu'il puisse être utile à plus de gens:

Depuis Java 9 les versions sont spécifiées comme 9, 10, 11, etc., au lieu de 1.8, 1.7, etc. Quelques lectures supplémentaires ici .

La façon dont vous spécifiez la version JDK avec <release>11</release> est correct. Il a été introduit avec maven-compiler-plugin 3.6 et est équivalent à l'ancienne, comme ci-dessous:

<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>

This post peut être utile pour utiliser maven-compiler-plugin avec JDK 11.

4
RKrum

Si quelqu'un cherche à spécifier Java 11 comme version à utiliser dans Spring (ou Spring Boot) dans un projet gradle, alors utilisez soit sourceCompatibility = '11' ou sourceCompatibility = '1.11' dans votre fichier 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 {

}
1
Ranuka

Vous ne devriez pas avoir besoin de mentionner le plugin maven-compiler dans votre fichier POM, si vous voulez seulement spécifier la version du compilateur. Ajoutez plutôt ces propriétés à votre fichier pom

<properties>
  <maven.compiler.source>1.8</maven.compiler.source>
  <maven.compiler.target>1.8</maven.compiler.target>
</properties>

Edit: Mon mauvais, il semble que les propriétés du numéro de version ont changé à partir de la version 3.6 du maven-compiler-plugin. L'exemple ci-dessus est parfait pour Java 8 et inférieur. Pour Java 9, ajoutez cette propriété:

<properties>
    <maven.compiler.release>9</maven.compiler.release>
</properties>

Consultez la réponse acceptée à cette question: Spécification Java dans maven - différences entre les propriétés et le plugin du compilateur

0
DwB