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

使用SonarQube Token执行Maven构建时遇API兼容性错误

问题原因与解决方案:SonarQube Maven扫描Jetty依赖导致的模块访问异常

问题原因

  • 本质是Java 9+模块系统(JPMS)的封装机制和旧版SonarQube扫描插件、Jetty依赖的兼容性冲突。
  • 你用的sonar-maven-plugin:3.9.1.2184版本偏老,它内部依赖的字节码分析工具会通过反射访问java.lang包的内部API,但Java 9+默认禁止未命名模块(旧版Jetty依赖没适配JPMS,属于这类模块)访问java.base模块的内部包,直接触发了InaccessibleObjectException,进而导致ExceptionInInitializerError。
  • Jetty旧依赖里的某些代码会和Sonar插件的反射逻辑叠加,把这个权限问题暴露出来,所以移除Jetty后构建恢复正常。

可行解决方案

1. 升级SonarQube Maven插件(优先推荐)

新版插件(4.0及以上)已经适配了Java模块系统,修复了反射访问的权限问题。直接修改pom.xml里的插件版本:

<plugin>
    <groupId>org.sonarsource.scanner.maven</groupId>
    <artifactId>sonar-maven-plugin</artifactId>
    <version>4.0.0.2929</version> <!-- 或更高稳定版本 -->
</plugin>

2. 保留Jetty依赖,添加JVM权限参数

如果暂时没法升级插件,可在构建时给JVM加参数,开放java.base模块的java.lang包给未命名模块:

mvn sonar:sonar -Dsonar.token=YOUR_TOKEN -Dmaven.compiler.fork=true -Dmaven.compiler.args="--add-opens java.base/java.lang=ALL-UNNAMED"

或者在pom.xml的maven-compiler-plugin里配置固定参数:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.1</version>
    <configuration>
        <compilerArgs>
            <arg>--add-opens</arg>
            <arg>java.base/java.lang=ALL-UNNAMED</arg>
        </compilerArgs>
    </configuration>
</plugin>

3. 升级Jetty到适配JPMS的版本

旧版Jetty没适配Java模块系统,升级到Jetty 11+版本(完全支持JPMS),从根源解决未命名模块的权限问题。比如:

<dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-server</artifactId>
    <version>11.0.15</version> <!-- 选稳定的适配JPMS版本 -->
</dependency>

内容的提问来源于stack exchange,提问作者Ch Pardha Saradhi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 15:35:04