Sonar Gradle插件访问受保护方法失败问题求助
问题原因分析
这个错误的核心是Java 9+模块系统(JPMS)的权限管控冲突:
- 本地运行正常,大概率是因为你的本地Java环境未启用模块模式,或者依赖版本的兼容性刚好适配;
- GitHub Enterprise Runner的Java环境默认启用了模块模式,而SonarQube Gradle插件引入的
commons-compress与commons-io版本组合,未被授予跨模块访问受保护方法的权限,导致GzipCompressorInputStream无法调用AbstractStreamBuilder.getInputStream()。
解决方案
1. 显式授予模块访问权限
在build.gradle中为Sonar任务添加JVM参数,允许commons-compress模块访问commons-io的受保护成员:
tasks.withType(org.sonarqube.gradle.SonarQubeTask) { jvmArgs += [ "--add-opens=org.apache.commons.io/org.apache.commons.io.build=org.apache.commons.compress", "--add-opens=org.apache.commons.io/org.apache.commons.io.build.AbstractStreamBuilder=org.apache.commons.compress" ] }
2. 强制统一依赖版本并排除冲突依赖
SonarQube插件可能自带了与你指定版本冲突的commons-compress/commons-io,需要强制统一版本并排除插件内置的依赖:
configurations.all { resolutionStrategy { // 选择兼容的版本组合,示例为经过验证的稳定搭配 force 'org.apache.commons:commons-io:2.15.1' force 'org.apache.commons:commons-compress:1.26.1' // 排除Sonar插件自带的冲突依赖 exclude group: 'org.apache.commons', module: 'commons-io' exclude group: 'org.apache.commons', module: 'commons-compress' } }
3. 对齐GitHub Runner与本地的Java版本
如果本地使用Java 8而Runner用Java 11+,会触发JPMS权限问题。在GitHub Actions workflow中指定与本地一致的Java版本:
steps: - name: Set up JDK uses: actions/setup-java@v4 with: java-version: '17' # 替换为你本地使用的Java版本 distribution: 'temurin'
4. 降级SonarQube Gradle插件版本
若上述方法无效,尝试使用更稳定的旧版本插件,避免依赖兼容性问题:
plugins { id 'org.sonarqube' version '4.4.1.3373' }
内容的提问来源于stack exchange,提问作者Hugo Dias
相关产品推荐
相关产品推荐

