1. 概述
在本篇教程中,我们将介绍如何在 Maven 项目中设置 Java 版本。
在开始之前,你可以通过运行 mvn -v
命令来查看 Maven 默认使用的 JDK 版本。这个命令会输出 Maven 当前运行所依赖的 Java 环境版本。
2. 使用 Maven Compiler 插件
最常见的方式是通过 maven-compiler-plugin 来指定 Java 版本。
2.1. 配置 Compiler 插件属性
第一种方式是在 pom.xml
的 <properties>
标签中配置:
<properties>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.source>1.8</maven.compiler.source>
</properties>
这里的 source
表示源代码的 Java 版本(例如是否支持 Lambda 表达式),而 target
则表示编译后生成的字节码版本,用于确保与目标 JVM 兼容。
默认情况下,这两个值都是 1.6。
✅ 如果你想更精细地控制编译行为,可以直接在插件配置中指定:
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
⚠️ 注意:这种方式更适合需要额外编译参数或自定义配置的场景。
2.2. Java 9 及以上版本支持
从 JDK 9 开始,新增了一个编译选项:--release
。它能自动处理跨平台兼容性问题。
❌ 传统的 -source
和 -target
并不能完全保证跨平台兼容性,尤其当你想在新版本 JDK 上编译出能在旧版本运行的 class 文件时,还需要配合 -bootclasspath
参数。
✅ 而使用 --release
就可以一步到位,它相当于同时设置了 -source
、-target
和 -bootclasspath
。
举个例子,在 pom.xml
的属性中可以这样写:
<properties>
<maven.compiler.release>17</maven.compiler.release>
</properties>
或者在 maven-compiler-plugin
中直接配置(适用于 3.6+ 版本):
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.12.1</version>
<configuration>
<release>7</release>
</configuration>
</plugin>
在这个例子中,我们使用的是 Java 17 编译器去构建兼容 Java 7 的 class 文件。无需本地安装 JDK 7,因为高版本 JDK 已经内置了对低版本 API 的兼容支持。
3. Spring Boot 项目的特殊处理
如果你的项目是基于 Spring Boot 的,那设置 Java 版本的方式略有不同。
首先你需要引入 spring-boot-starter-parent
作为父 POM:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
</parent>
该父 POM 默认将 Java 版本设置为 1.8。
你可以通过覆盖 <java.version>
属性来自定义:
<properties>
<java.version>17</java.version>
</properties>
⚠️ 这个属性是 Spring Boot 特有的机制。它会同时影响源码和目标 JVM 的版本。
⚠️ 另外请注意:Spring Boot 2.0 起最低要求 Java 8,因此你无法再将 Java 版本设为更低的版本(比如 1.7)。
4. 总结
本文总结了几种在 Maven 项目中设置 Java 版本的方法:
- ✅ 对于 Spring Boot 项目,推荐使用
<java.version>
属性。 - ✅ 对于普通项目,使用
<maven.compiler.source>
和<maven.compiler.target>
是最常见且简洁的方式。 - ✅ 如果需要更强的控制能力,建议直接配置
maven-compiler-plugin
插件。 - ✅ 若使用 Java 9 或更高版本,优先考虑使用
<release>
属性以实现更好的跨平台兼容性。
选择哪种方式取决于你的项目类型和具体需求,合理使用可以让构建过程更加清晰可控。