JDK11下SonarQube扫描因tools.jar依赖失败的解决咨询
解决方案:通过Maven Profile按JDK版本控制tools.jar依赖
核心原因
JDK 9及以上版本已移除tools.jar(该jar包合并到JDK核心模块中),而你的项目依赖的jboss-as-clustering-api间接引入了这个仅存在于JDK8的依赖,导致JDK11环境下Sonar扫描报错。修改JAVA_HOME指向JDK8无效是因为SonarQube 9.9强制要求运行环境为JDK11+,扫描进程本身必须基于JDK11。
实现步骤
你需要通过Maven Profile实现基于JDK版本的依赖动态控制,具体配置如下:
在项目POM中添加Profile配置
定义两个Profile,分别适配JDK8和JDK9+环境,自动根据当前JDK版本激活:<profiles> <!-- JDK8环境:保留tools.jar依赖 --> <profile> <id>jdk8</id> <activation> <jdk>1.8</jdk> </activation> <dependencies> <!-- 显式引入tools.jar,确保间接依赖可被解析 --> <dependency> <groupId>com.sun</groupId> <artifactId>tools</artifactId> <version>1.8</version> <scope>system</scope> <systemPath>${java.home}/../lib/tools.jar</systemPath> </dependency> </dependencies> </profile> <!-- JDK9+环境:排除tools.jar的间接依赖 --> <profile> <id>jdk11+</id> <activation> <jdk>[9,)</jdk> </activation> <dependencies> <!-- 显式声明jboss-as-clustering-api依赖,并排除tools.jar --> <dependency> <groupId>org.jboss.as</groupId> <artifactId>jboss-as-clustering-api</artifactId> <version>你的依赖版本</version> <exclusions> <exclusion> <groupId>com.sun</groupId> <artifactId>tools</artifactId> </exclusion> </exclusions> </dependency> </dependencies> </profile> </profiles>Jenkins项目配置调整
- 原JDK8构建项目:无需额外配置,Maven会自动激活
jdk8Profile,保持原有构建逻辑正常运行。 - SonarQube扫描项目(JDK11环境):确保Jenkins任务使用JDK11执行Maven命令,Maven会自动激活
jdk11+Profile,排除无效的tools.jar依赖,避免扫描报错。
- 原JDK8构建项目:无需额外配置,Maven会自动激活
额外优化建议
- 检查
jboss-as-clustering-api是否有适配JDK11的新版本,若有则直接升级依赖版本,从根源上消除对tools.jar的依赖,比Profile方案更彻底。 - 若不想显式声明
jboss-as-clustering-api,也可在jdk11+Profile中通过<dependencyManagement>统一排除该间接依赖:<profile> <id>jdk11+</id> <activation> <jdk>[9,)</jdk> </activation> <dependencyManagement> <dependencies> <dependency> <groupId>org.jboss.as</groupId> <artifactId>jboss-as-clustering-api</artifactId> <version>你的依赖版本</version> <exclusions> <exclusion> <groupId>com.sun</groupId> <artifactId>tools</artifactId> </exclusion> </exclusions> </dependency> </dependencies> </dependencyManagement> </profile>
内容的提问来源于stack exchange,提问作者gargle
相关产品推荐
相关产品推荐

