Docker SonarQube Scanner扫描Node.js代码时遇InaccessibleObjectException错误
问题背景
使用GitHub Actions的Docker版SonarQube Scanner扫描Node.js代码时,触发java.lang.reflect.InaccessibleObjectException错误,扫描完成后Node.js代码无法在SonarQube平台展示。切换至JVM 17环境的普通sonar-scanner执行扫描,问题仍未解决。
错误堆栈
java.lang.reflect.InaccessibleObjectException: Unable to make field private final java.util.Map java.util.Collections$UnmodifiableMap.m accessible: module java.base does not "opens java.util" to unnamed module @xxxxxxx
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354)
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297)
at java.base/java.lang.reflect.Field.checkCanSetAccessible(Field.java:178)
at java.base/java.lang.reflect.Field.setAccessible(Field.java:172)
...(省略后续调用栈内容)
环境信息
- Docker扫描器镜像:
sonarsource/sonar-scanner-cli:latest - 普通sonar-scanner版本:4.8.0.2856
- JVM版本:OpenJDK 17.0.8
- 扫描触发方式:GitHub Actions
复现命令
# Docker版扫描命令 docker run --rm \ -e SONAR_HOST_URL="http://your-sonarqube-instance" \ -e SONAR_LOGIN="your-auth-token" \ -v "$(pwd):/usr/src" \ sonarsource/sonar-scanner-cli:latest # 普通sonar-scanner命令 sonar-scanner \ -Dsonar.host.url=http://your-sonarqube-instance \ -Dsonar.login=your-auth-token
可行解决思路
1. 添加JVM参数开放模块访问
该错误是JVM模块系统限制导致,可通过添加JVM参数允许非命名模块访问java.util包:
- 对于Docker扫描器,在启动命令中添加
SONAR_SCANNER_OPTS环境变量:
docker run --rm \ -e SONAR_HOST_URL="http://your-sonarqube-instance" \ -e SONAR_LOGIN="your-auth-token" \ -e SONAR_SCANNER_OPTS="--add-opens java.base/java.util=ALL-UNNAMED" \ -v "$(pwd):/usr/src" \ sonarsource/sonar-scanner-cli:latest
- 对于普通sonar-scanner,设置环境变量后执行:
export SONAR_SCANNER_OPTS="--add-opens java.base/java.util=ALL-UNNAMED" sonar-scanner -Dsonar.host.url=http://your-sonarqube-instance -Dsonar.login=your-auth-token
2. 降级JVM版本至11
JVM 17的模块限制比JVM 11更严格,可尝试切换至JVM 11环境执行扫描:
- Docker镜像可指定使用基于JVM 11的版本,如
sonarsource/sonar-scanner-cli:4.8.0-j11 - 普通sonar-scanner搭配JDK 11运行
3. 检查SonarQube插件兼容性
确保SonarQube服务器上的JavaScript/TypeScript插件版本与扫描器版本兼容,可尝试更新插件至最新稳定版。
后续跟进
该问题已在SonarSource社区提交,可关注社区反馈获取官方修复方案。
内容的提问来源于stack exchange,提问作者kiran kumar

