目录
核心报错拆解
字面含义
四大常见诱因(按概率排序)
1. SonarQube 服务端与本地 Scanner 版本严重不匹配(最高频)
2. SonarQube 服务端接口返回异常数据(返回空 / 残缺 JSON)
3. Jenkins 配置参数错误,覆盖了服务端接口返回数据
4. 缓存 / 权限问题干扰文件列表解析
分步解决方案
步骤 1:统一 Scanner 与 SonarQube 服务端版本(优先修复)
步骤 2:校验 sonar.host.url 连通性
步骤 3:清理损坏缓存
步骤 4:排查代理与认证
步骤 5:临时规避方案(离线扫描)
最简总结
核心报错拆解
java.lang.IllegalStateException: Fail to download libraries from server Caused by: java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 1 at org.sonar.runner.Bootstrapper.getBootstrapFiles(Bootstrapper.java:224)字面含义
Bootstrapper 从 SonarQube 服务端拉取启动依赖文件列表时,拿到的数组长度只有1,代码却尝试读取下标1(数组下标从 0 开始,长度 1 仅能访问下标 0),数组越界。
四大常见诱因(按概率排序)
1. SonarQube 服务端与本地 Scanner 版本严重不匹配(最高频)
- 旧版 Sonar Runner(老 sonar-runner 独立工具)连接新版 SonarQube 服务端(9.x/10.x)新版 SonarQube 接口返回的启动文件格式重构,老解析代码不兼容,返回数组长度变短,直接下标越界。
- 反向:新版 Scanner 连接极其老旧 SonarQube 5.x/6.x 服务端,接口返回数据格式不兼容。
2. SonarQube 服务端接口返回异常数据(返回空 / 残缺 JSON)
触发场景:
- Jenkins 机器无法完整访问 SonarQube
/batch/index引导接口(网络拦截、反向代理 Nginx/Apache 截断响应、防火墙丢包) - SonarQube 服务宕机 / 内存溢出,接口返回半截 JSON、空数组
- HTTPS 证书、代理配置错误,接口返回 401/403/500 错误页面而非标准 JSON Bootstrapper 解析残缺响应生成数组长度 = 1,代码硬编码读取下标 1 直接报错。
3. Jenkins 配置参数错误,覆盖了服务端接口返回数据
错误配置示例:
sonar.host.url填错(填成前端页面地址、带多余路径、IP 端口错误)- 配置了无效
sonar.bootstrap.url自定义引导地址,返回非法数据 - 代理参数
sonar.http.proxy配置错乱,网络转发篡改接口返回内容
4. 缓存 / 权限问题干扰文件列表解析
日志可见缓存目录:/var/jenkins_home/.sonar/cache
- 旧缓存文件损坏,Scanner 读取本地缓存文件列表格式错乱
- Jenkins 用户无权限读写缓存目录,读取缓存时获取残缺数据
分步解决方案
步骤 1:统一 Scanner 与 SonarQube 服务端版本(优先修复)
- 查看 SonarQube 服务端版本(页面底部)
- 替换对应兼容扫描器:
- SonarQube 7.9+:使用
sonar-scanner(推荐),废弃老旧sonar-runner - SonarQube 10.x:必须使用 5.0+ 版本 sonar-scanner
- SonarQube 7.9+:使用
- Jenkins 全局工具配置中更新 Sonar Scanner 版本。
步骤 2:校验 sonar.host.url 连通性
在 Jenkins 机器手动执行 curl 测试引导接口:
# 替换为你的Sonar地址 curl http://sonar-server:9000/batch/index- 正常:返回一段 JSON 数组(包含启动 jar 包信息)
- 异常:返回 HTML 报错、空内容、401/500 → 修复网络 / 代理 / 权限 / Nginx 反向代理配置。
步骤 3:清理损坏缓存
Jenkins Pipeline 构建前增加清理命令:
rm -rf /var/jenkins_home/.sonar/cache rm -rf ./target/.sonar或修改 Jenkins 启动用户,赋予.sonar目录完整读写权限。
步骤 4:排查代理与认证
- 若 SonarQube 需账号密码登录,确认配置:
plaintext
sonar.login=管理员token sonar.password= - 若内网需要代理,正确配置代理参数,不要错误代理内网 Sonar 地址:
plaintext
sonar.http.proxyHost=xxx sonar.http.proxyPort=xxx sonar.http.nonProxyHosts=sonar-server
步骤 5:临时规避方案(离线扫描)
网络 / 接口长期不通时,使用离线模式,提前把 Sonar 依赖包下载到 Jenkins 机器本地,跳过从服务端下载引导库逻辑。
最简总结
报错本质:Scanner 解析 SonarQube 服务端返回的启动文件列表时数据格式异常,90% 情况是扫描器与服务端版本不兼容,其次是网络 / 代理导致接口返回残缺数据。