如何配置Maven从替代位置加载tools.jar依赖
如何配置Maven从替代位置加载tools.jar依赖
我之前在JDK11+环境里折腾老Maven插件的时候,也碰到过一模一样的tools.jar问题,尤其是还不能碰系统目录的情况下,简直头大!结合你的情况——只能操作自己的用户目录、用的是JDK15,给你两个落地的解决办法:
方法一:手动在本地仓库安装模拟的tools.jar依赖
因为JDK15已经没有原生的tools.jar了,它的功能被拆进了JDK的模块化组件里,我们可以从JDK的模块导出对应内容,打包成jar后安装到你用户目录下的本地Maven仓库,这样老POM里的依赖就能正常识别:
- 先在你的用户目录下新建一个临时文件夹,比如
~/temp-tools-jar - 执行下面的命令,从JDK的
jdk.compiler模块导出内容,打包成tools.jar(记得把${java.home}替换成你实际的JDK路径,比如/usr/lib/jvm/jdk-15):jar --create --file=~/temp-tools-jar/tools.jar --module-version=15.0.0 --main-class=com.sun.tools.javac.Main -C ${java.home}/mods/jdk.compiler . - 接着用Maven命令把这个jar安装到你的本地仓库(也就是用户目录下的
.m2/repository):mvn install:install-file -Dfile=~/temp-tools-jar/tools.jar -DgroupId=com.sun -DartifactId=tools -Dversion=15.0.0 -Dpackaging=jar - 最后回到你的项目POM,把原来
com.sun:tools依赖的版本改成15.0.0,去掉systemscope和systemPath配置,这样Maven就会自动从你本地仓库加载这个依赖了。
方法二:修改POM依赖的system scope路径(适合不想手动打包的情况)
如果不想折腾打包步骤,也可以直接修改POM里的依赖配置,指向JDK15里包含原tools.jar内容的模块路径:
- 找到POM里的
com.sun:tools依赖节点,修改成下面这样:
要是你的JDK里只有<dependency> <groupId>com.sun</groupId> <artifactId>tools</artifactId> <version>15.0.0</version> <scope>system</scope> <!-- 指向JDK15里的jdk.compiler模块对应文件,路径根据你的实际JDK位置调整;如果是jmod文件,可先解压到用户目录再指向解压后的jar --> <systemPath>${user.home}/my-jars/tools-proxy.jar</systemPath> </dependency>jdk.compiler.jmod文件,你可以用unzip命令把它解压到用户目录下的某个文件夹,再把解压出的内容打包成jar,把上面的systemPath指向这个自定义jar的路径就行,毕竟你只能操作自己的目录,这样更稳妥。
额外小技巧
如果不想每个项目都改POM,你可以在用户目录下的.m2/settings.xml里添加一个全局profile,让所有项目自动加载这个依赖:
<profiles> <profile> <id>jdk-tools-fix</id> <activation> <activeByDefault>true</activeByDefault> </activation> <dependencies> <dependency> <groupId>com.sun</groupId> <artifactId>tools</artifactId> <version>15.0.0</version> <scope>system</scope> <systemPath>${user.home}/temp-tools-jar/tools.jar</systemPath> </dependency> </dependencies> </profile> </profiles>
这样不管你跑哪个项目,只要用的是当前用户的Maven配置,都会自动加载这个依赖,省了不少重复操作。
备注:内容来源于stack exchange,提问作者Keith Fosberg
相关产品推荐
相关产品推荐

