Learn to configure the Java compiler version in a Maven project using different approaches. Also, learn to set the Java version for a Spring boot application using Maven as a build tool.
1. Using the Maven Compiler Plugin
maven.compiler.source: will allow the language features from Java 17 (and previous versions) in the source code.
maven.compiler.target: will generate the compiled classes compatible with Java 17. The application will run on Java 17 and later versions. It will not run in the previous versions of Java 17.
The default value for both properties is Java 1.8 in the latest version of the Maven compiler plugin.
<?xml version="1.0" encoding="UTF-8"?> <project ...> ... <properties> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> </properties> ... </project>
The same configuration can directly be applied to the compiler plugin as follows:
<?xml version="1.0" encoding="UTF-8"?> <project ...> ... <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>17</source> <target>17</target> </configuration> </plugin> </plugins> ... </project>
Avoid Pitfall due to Version Mismatch
Note that setting the
target option does not guarantee that application actually runs on a JRE with the specified version. If we have used source with a later version and used new language features then the code will fail at runtime with a linkage error.
Consider the following configuration where
source is set to Java 17 and
target is set to Java 11.
<properties> <maven.compiler.source>17</maven.compiler.target> <maven.compiler.target>11</maven.compiler.source> </properties>
If we use the Java 17 specific new Language features (such as Sealed Classes) then, in runtime, the project will fail with a linkage error.
2. Cross-Compilation Support Since Java 9
As noticed earlier, the default source and target attributes don’t guarantee a cross-compilation preventing the application to run on the older JDK versions.
We can enable the cross-compilation, allowing the application to run on older Java versions, by using the maven.compiler.release property.
<properties> <maven.compiler.release>8</maven.compiler.release> </properties>
The same configuration can be written with the
release attribute in the Maven compiler plugin configuration:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.0</version> <configuration> <release>8</release> </configuration> </plugin>
Note that, for cross-compilation, we must have installed Java 9 or later in the machine. We can check the Java version used by Maven using the ‘mvn -v’ command. Maven uses the
JAVA_HOME parameter to find which Java version it is supposed to run.
mvn -v Apache Maven 3.8.1 (05c21c65bdfed0f71a2f2ada8b84da59348c4c5d) Maven home: C:\devsetup\maven\bin\.. Java version: 19-loom, vendor: Oracle Corporation, runtime: C:\devsetup\JDKs\jdk19 Default locale: en_IN, platform encoding: UTF-8 OS name: "windows 11", version: "10.0", arch: "amd64", family: "windows"
3. Set Java Version in a Spring Boot Project
The Spring boot applications use java.version property for compiling the project’s source code. Note that java.version property is specific to the Spring boot framework only.
We can specify this property in the pom.xml as follows:
<properties> <java.version>17</java.version> </properties>
It is worth knowing that if we do not define this property then Spring boot resolves this property from the starter POM file:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> </parent>
- The default and minimum Java version for Spring Boot 2.x projects is Java 1.8.
- The default and minimum Java version for Spring Boot 3.x projects is Java 17.
4. Changing the Java Version from Command Line
If we have not overridden the Java versions in the pom.xml file and the project is using the default Java version used by Maven, we can still compile the project with a different Java version. To do so, we can change the
JAVA_HOME environment variable in the command prompt and then use the
mvn build command to build the application binary.
JAVA_HOME=/path/to/jdk17/ mvn build
The key takeaways from this tutorial are:
- Use java.version property to configure the Java version for a Spring boot application.
- Use maven.compiler.source and maven.compiler.target properties for other Java applications.
- Use maven.compiler.release property for cross-compilation. It is usually a better approach than the former.
Happy Learning !!