使用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
相关产品推荐
相关产品推荐

