使用SonarQube扫描应用时遇API兼容性错误求排查
解决SonarQube Maven扫描时的java.lang.reflect.InaccessibleObjectException问题
问题根源
你使用的Sonar Maven插件3.9.1版本偏旧,对Java 11的模块系统适配不足。Java 9+引入的模块机制会限制反射访问核心包,插件尝试访问java.lang包时触发了权限限制,进而抛出InaccessibleObjectException。
可行解决方法
1. 升级Sonar Maven插件版本
直接将插件升级到3.10.0及以上版本,这些版本修复了Java 11的模块兼容性问题:
- 方式一:在项目
pom.xml中指定插件版本
<build> <plugins> <plugin> <groupId>org.sonarsource.scanner.maven</groupId> <artifactId>sonar-maven-plugin</artifactId> <version>3.10.0.2594</version> </plugin> </plugins> </build>
- 方式二:执行命令时直接指定插件版本
mvn org.sonarsource.scanner.maven:sonar-maven-plugin:3.10.0.2594:sonar -Dsonar.host.url=$SONAR_HOST_URL -Dsonar.login=$SONAR_AUTH_TOKEN -Dsonar.projectKey=$SONAR_PROJECT_KEY -Dsonar.projectName=$CI_PROJECT_PATH_SLUG
2. 临时开放Java模块访问权限
如果暂时无法升级插件,给Maven命令添加JVM参数,开放java.lang包的反射访问权限:
export MAVEN_OPTS="--add-opens java.base/java.lang=ALL-UNNAMED" mvn sonar:sonar -Dsonar.host.url=$SONAR_HOST_URL -Dsonar.login=$SONAR_AUTH_TOKEN -Dsonar.projectKey=$SONAR_PROJECT_KEY -Dsonar.projectName=$CI_PROJECT_PATH_SLUG
或者直接将参数嵌入命令:
mvn sonar:sonar -Dsonar.host.url=$SONAR_HOST_URL -Dsonar.login=$SONAR_AUTH_TOKEN -Dsonar.projectKey=$SONAR_PROJECT_KEY -Dsonar.projectName=$CI_PROJECT_PATH_SLUG -Dmaven.compiler.fork=true -Dadditionalparam="--add-opens java.base/java.lang=ALL-UNNAMED"
3. 确认环境兼容性
你的SonarQube 8.9.10是LTS版本,和Java 11、升级后的插件完全兼容,不需要改动SonarQube服务端版本。
内容的提问来源于stack exchange,提问作者Lukáš Antol
相关产品推荐
相关产品推荐

