升级SonarQube至9.8后扫描报错:Java版本不兼容且缺失wrapper.conf
问题场景
- SonarQube从8.9升级至9.8,ZIP包不含
wrapper.conf文件,原计划通过该文件指定Java11路径的方案不可行 - Azure自托管代理机器默认
JAVA_HOME为Java8(应用依赖),已安装Java11但未设为默认 - 执行
SonarQubeAnalyze@4任务时抛出错误:
##[error]ERROR: Error during SonarScanner execution
ERROR: Error during SonarScanner execution
INFO: ------------------------------------------------------------------------
##[error]java.lang.UnsupportedClassVersionError: org/sonar/batch/bootstrapper/EnvironmentInformation has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0
无wrapper.conf时的解决方案(不修改应用配置)
方案1:在Azure流水线任务中临时指定Java11环境变量
在SonarQubeAnalyze@4任务前添加对应脚本任务,临时切换扫描任务的Java环境:
- Windows代理(PowerShell):
# 替换为实际Java11安装路径 $java11Path = "C:\Program Files\Java\jdk-11.0.20" [Environment]::SetEnvironmentVariable("JAVA_HOME", $java11Path, "Process") $env:PATH = "$java11Path\bin;" + $env:PATH
- Linux代理(Bash):
# 替换为实际Java11安装路径 export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 export PATH=$JAVA_HOME/bin:$PATH
方案2:直接在SonarQubeAnalyze@4任务中配置环境变量
利用Azure DevOps任务的env参数,仅为扫描任务指定Java11环境:
- task: SonarQubeAnalyze@4 displayName: '执行SonarQube扫描' env: JAVA_HOME: 'C:\Program Files\Java\jdk-11.0.20' # Linux环境需调整路径格式 PATH: '$(JAVA_HOME)\bin;$(PATH)' # Linux环境用冒号分隔路径
方案3:通过SonarScanner参数指定Java11路径
若使用SonarScanner CLI执行扫描,可直接在命令中添加参数指定Java11路径:
sonar-scanner -Dsonar.java.jdkHome="C:\Program Files\Java\jdk-11.0.20" # 补充其他扫描参数
可将此命令作为脚本任务替代SonarQubeAnalyze@4任务(按需选用)。
说明
SonarQube 9.x仅要求扫描器运行在Java11及以上环境,不影响对Java8代码的分析——只需保证扫描过程使用Java11,应用本身仍可维持Java8环境不变。
内容的提问来源于stack exchange,提问作者Sanjesh M

