为何部分Maven依赖会查找错误的Java版本?
问题分析与解决步骤
核心问题
javassist 3.18.1-GA的POM文件中硬编码了${java.home}/../lib/tools.jar路径,但Java 9及以上版本已移除tools.jar文件;同时Maven构建时实际调用的是JDK 23(而非你命令行显示的JDK 17),导致路径不存在报错。
1. 确认Maven实际使用的JDK版本
执行以下命令,查看输出中的Java版本,确认是否为JDK 23:
mvn -version
命令行的java和Maven依赖的JDK可能不一致——Maven会优先读取JAVA_HOME环境变量,或系统默认的JDK路径。
2. 强制Maven使用JDK 17
提供三种可行方案,按需选择:
- 临时构建时指定:在执行Maven命令前先设置环境变量
export JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.12/libexec/openjdk.jdk/Contents/Home mvn clean install - 全局配置Maven:新建或编辑
~/.mavenrc文件,添加以下内容(重启终端生效)export JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.12/libexec/openjdk.jdk/Contents/Home - 项目级绑定:在项目根POM中添加
maven-compiler-plugin配置,强制指定JDK版本(覆盖自定义的jdkLevel属性)<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.12.1</version> <configuration> <source>17</source> <target>17</target> <fork>true</fork> <executable>${JAVA_HOME}/bin/javac</executable> <compilerVersion>17</compilerVersion> </configuration> </plugin> </plugins> </build>
3. 彻底解决tools.jar依赖问题
javassist 3.18.1-GA是2014年的老旧版本,未适配Java 9+的目录结构。建议升级到适配新版本Java的javassist版本(如3.28.0-GA及以上),可通过以下方式在项目中替换:
<dependencies> <dependency> <groupId>org.glassfish.hk2</groupId> <artifactId>hk2-locator</artifactId> <version>2.4.0-b31</version> <exclusions> <exclusion> <groupId>org.javassist</groupId> <artifactId>javassist</artifactId> </exclusion> </exclusions> </dependency> <!-- 引入适配Java9+的javassist版本 --> <dependency> <groupId>org.javassist</groupId> <artifactId>javassist</artifactId> <version>3.29.2-GA</version> </dependency> </dependencies>
4. 长期切换系统默认JDK为17
如果需要将JDK 17设为系统默认,可通过brew执行:
brew unlink openjdk && brew link openjdk@17 --force
执行后重启终端,再次验证java -version和mvn -version的版本是否一致。
内容的提问来源于stack exchange,提问作者gph
相关产品推荐
相关产品推荐

