Issue
What is the correct way of specifying Java 11 as the version to be used in Spring (or Spring Boot) pom.xml file?
I.e., what value do I need to put in the java.version
property of the pom?
For Java 8 we use 1.8
, just like the documentation shows, for Java 9 it's 1.9
.
I'm not sure if Java 11 would be 1.11
(although it seems unlikely), and I've seen it specified as just 11
when using maven-compiler-plugin
, however I'm not using the compiler plugin.
e.g.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<release>11</release>
</configuration>
</plugin>
I've searched around and couldn't find the answer, as pretty much any documentation I've read as well as blog posts related to the Java version only show versions 8 or 9.
So what should I use? 1.11
or just 11
?
I tried both and my web server seems to start correctly and compile correctly (IntelliJ shows Information:javac 11.0.2 was used to compile java sources
) however I'm not entirely convinced that changing the java.version
value is doing anything, because I can set it to e.g. 100
and everything works fine.
The only related questions I could find are: Minimum Spring version compatible with Java 11, Spring Boot fails due to a Hibernate error after migrating to JDK 11 and Spring 4.3.x with OpenJDK 11, but they don't really shed any light.
Solution
Short Answer:
The correct way is to use the followings values in <java.version>
for different Java versions:
- Java 8 : 1.8 or 8
- Java 9 : 9
- Java 10 : 10
- Java 11 : 11
- Java 12 : 12
So for Java 11 , it should be:
<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.
Actually , at the end it still uses maven-compiler-plugin
to compile. Springboot just configures a <java.version>
property such that by changing this value , you are implicitly changing maven-compiler-plugin
's <source/>
and <target/>
to the same value as what specified in the <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>
Detailed Answer:
Seem like you want details to convince you.
It is because every spring boot project will extend the parent pom spring-boot-starter-parent
which defines <java.version>
as follows:
<properties>
<java.version>1.8</java.version>
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
</properties>
From the maven-compiler-plugin docs, maven.compiler.source
and maven.compiler.target
are the user property for the <source>
and <target>
config parameters. Due to the behaviour of the user property, setting these two properties to 11
means to set the following :
<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>
From the maven-compiler-plugin
docs again, <source>
and <target>
are the -source
and -target
argument for the Java compiler (javac
). Then, from javac docs, we can see that these two arguments are allowed to have the following values:
- 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.
Hence, <java.version>
should be set to 11
for Java 11.
Answered By - Ken Chan