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

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版本的依赖动态控制,具体配置如下:

  1. 在项目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>
    
  2. Jenkins项目配置调整

    • 原JDK8构建项目:无需额外配置,Maven会自动激活jdk8 Profile,保持原有构建逻辑正常运行。
    • SonarQube扫描项目(JDK11环境):确保Jenkins任务使用JDK11执行Maven命令,Maven会自动激活jdk11+ Profile,排除无效的tools.jar依赖,避免扫描报错。

额外优化建议

  • 检查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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 04:52:31