如何配置Maven使用Java 8构建依赖Java 8的项目?
问题背景
我的Maven项目依赖Java 8,希望构建时使用该版本,但本地Maven默认调用Java 21。已在pom.xml的properties及maven-compiler-plugin中配置Java 8版本,但执行mvn -version仍显示:
Maven home: /usr/local/Cellar/maven/3.9.6/libexec Java version: 21.0.1, vendor: Homebrew, runtime: /usr/local/Cellar/openjdk/21.0.1/libexec/openjdk.jdk/Contents/Home Default locale: en_IN, platform encoding: UTF-8 OS name: "mac os x", version: "13.4.1", arch: "x86_64", family: "mac"
执行mvn clean install时触发错误:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.3:compile (default-compile) on project mtl-billing: Fatal error compiling: java.lang.NoSuchFieldError: Class com.sun.tools.javac.tree.JCTree$JCImport does not have member field 'com.sun.tools.javac.tree.JCTree qualid' -> [Help 1]
判断该错误与Java版本不匹配有关,切换到Java 8即可解决。本地已安装Java 8,which java输出:/usr/local/opt/openjdk@8/bin/java
此前尝试在pom.xml的properties中配置低版本Maven:
<properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <maven.version>3.0.4</maven.version> </properties>
但该配置未生效。
解决方案
方法1:临时指定Java版本执行Maven命令
每次执行构建时,通过JAVA_HOME指定Java 8的JDK根目录(注意不是bin/java路径):
JAVA_HOME=/usr/local/opt/openjdk@8 mvn clean install
方法2:永久绑定项目到Java 8(使用maven-toolchains-plugin)
通过插件强制Maven使用指定JDK,无需每次手动配置:
- 在用户目录下创建
~/.m2/toolchains.xml,内容如下:
<?xml version="1.0" encoding="UTF-8"?> <toolchains> <toolchain> <type>jdk</type> <provides> <version>1.8</version> <vendor>openjdk</vendor> </provides> <configuration> <jdkHome>/usr/local/opt/openjdk@8</jdkHome> </configuration> </toolchain> </toolchains>
- 在项目pom.xml中添加插件配置,同时升级compiler-plugin到兼容Java 8的版本:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-toolchains-plugin</artifactId> <version>3.1.0</version> <executions> <execution> <goals> <goal>toolchain</goal> </goals> </execution> </executions> <configuration> <toolchains> <jdk> <version>1.8</version> <vendor>openjdk</vendor> </jdk> </toolchains> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build>
方法3:临时切换终端Java环境
在当前终端执行以下命令,临时将Java环境切换到8:
export JAVA_HOME=/usr/local/opt/openjdk@8 export PATH=$JAVA_HOME/bin:$PATH
之后执行mvn clean install即可使用Java 8,关闭终端后恢复默认配置。
关键注意点
- 配置
<maven.version>3.0.4</maven.version>无效,该属性无法改变本地安装的Maven版本,需通过JAVA_HOME或toolchains插件指定JDK版本。 - 原报错也与maven-compiler-plugin版本过旧(3.3)有关,升级到3.8.1可避免与高版本JDK的兼容性问题。
内容的提问来源于stack exchange,提问作者vinty

