You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 08:15:04