SonarQube8.1升级后用JDK11扫描报jdk.tools:1.6缺失如何解决?
问题根因
jdk.tools:jdk.tools是JDK 8及更早版本自带的工具包,从JDK 9开始官方已经完全移除了tools.jar。你在JDK 11环境下执行Maven命令时,项目依赖树中存在对jdk.tools:jdk.tools的引用,Maven在指定路径下找不到对应jar包就会抛出该异常,和SonarQube本身的扫描逻辑无关。
解决方案
按优先级推荐以下两种方案:
方案一:优化Sonar阶段执行逻辑(推荐)
你已经单独配置了JDK 8环境的编译阶段,Sonar扫描阶段不需要重复执行编译、验证流程,直接基于已生成的字节码和源码扫描即可。
修改Sonar阶段的Maven命令,移除verify生命周期,增加跳过编译的参数:
sonarqube: stage: sonar image: maven:3.8.1-openjdk-11-slim script: - cd some-service/backend - mvn -q -U -B sonar:sonar --settings ../../settings.xml -DskipTests=true -Dmaven.compile.skip=true -Dsonar.host.url=$SONAR_URL -Dsonar.login=$SONAR_LOGIN tags: - dev only: - schedules
调整后不会在JDK 11环境下触发编译流程,自然不会触发tools.jar的查找逻辑。
方案二:排除JDK高版本下的tools.jar依赖
如果必须在Sonar阶段执行编译逻辑,可以在项目pom.xml中添加Maven Profile,针对JDK 11及以上版本排除tools.jar依赖:
- 首先执行
mvn dependency:tree查找哪个依赖引入了jdk.tools:jdk.tools,记录对应父依赖的groupId和artifactId - 在pom.xml中添加如下Profile配置:
<profiles> <profile> <id>jdk11-plus</id> <activation> <jdk>[11,)</jdk> </activation> <dependencies> <!-- 替换为你找到的引入tools.jar的父依赖 --> <dependency> <groupId>父依赖groupId</groupId> <artifactId>父依赖artifactId</artifactId> <version>父依赖版本</version> <exclusions> <exclusion> <groupId>jdk.tools</groupId> <artifactId>jdk.tools</artifactId> </exclusion> </exclusions> </dependency> </dependencies> </profile> </profiles>
额外校验配置
确保Sonar扫描参数中指定了正确的Java源码和目标版本,避免字节码版本不兼容的问题,在sonar命令中添加如下参数即可:-Dsonar.java.source=8 -Dsonar.java.target=8
内容的提问来源于stack exchange,提问作者Prashant Raghav
相关产品推荐
相关产品推荐

