返回

解决Jenkins SonarQube扫描器UnsupportedClassVersionError

java

Jenkins SonarQube 扫描器报错:UnsupportedClassVersionError

在 Jenkins 构建任务中执行 SonarQube 代码分析时,有时会遇到 UnsupportedClassVersionError。这个错误通常发生在 Java 版本不匹配的情况下,Jenkins 尝试使用较低的 Java 版本来运行使用较高 Java 版本编译的 SonarQube 扫描器。

错误分析

错误消息java.lang.UnsupportedClassVersionError: ... has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 55.0 清晰地表明问题所在。这里的 61.0 对应于 Java 17,而 55.0 则对应于较早版本的 Java。 简单来说,你的 Jenkins 运行环境中使用了过时的 Java 版本,它无法执行由 Java 17 编译的 SonarQube 扫描器。

根本原因是 SonarQube 扫描器工具链自身通常依赖特定版本的 Java 运行时环境。Jenkins 作为一个 CI/CD 工具,自身也需要在 Java 环境下运行。两者若使用的 Java 版本不一致,则会造成运行时兼容性问题。

解决方法一:配置 Jenkins 全局 JDK

原理: 配置 Jenkins 全局 JDK 可确保所有构建任务都可使用正确版本的 Java 环境,从而解决 Java 版本不兼容问题。

操作步骤:

  1. 进入 Jenkins 控制面板,选择 “Manage Jenkins”。
  2. 点击 “Tools”。
  3. 找到 “JDK” 部分,点击“JDK installations...”。
  4. 点击“Add JDK”,填写JDK名称(例如:“JDK17”) 。
  5. 选择 “Install automatically”,选择所需的 Java 版本,这里我们选择 JDK17。Jenkins会自动下载和安装对应的JDK。 如果不便在线下载JDK,可选择”Install from ZIP file“选项,上传你事先准备好的 JDK 文件包。
  6. 保存设置。

代码示例 (Jenkinsfile):

pipeline {
    agent any
    tools {
       jdk 'JDK17'
    }
    stages {
        stage('SonarQube Analysis') {
            steps {
               // ... your sonarqube analysis commands ...
            }
        }
    }
}

说明: 此处定义在 pipeline 代码中使用的工具 jdk 是 "JDK17",jenkins 将确保任务运行在正确配置的JDK环境中。

安全建议: 定期更新 JDK 版本。使用 “Install automatically” 模式时,Jenkins 可能会从不信任的源下载 JDK。 建议尽可能配置内网镜像,保证安全性,避免安全隐患。

解决方法二: 任务级 JDK 配置

原理: 如果只希望某个特定 Jenkins 任务使用特定 JDK 版本,可以在任务层面配置 JDK,避免影响全局环境设置。

操作步骤:

  1. 编辑 Jenkins 构建任务。
  2. 在“构建环境”或“Build Environment”部分,找到 “Tool Locations” 区域。
  3. 勾选 "Environment variables" 选项。
  4. 输入JAVA_HOME 的 name 并设置它的 value。这个 value 就是 JDK17 在你机器上的真实路径,可以使用 jenkins 工具中已安装的JDK目录,或者外部已配置好的JDK目录,例如: /opt/jdk-17.0.8
  5. 在脚本或者其他构建步骤中指定 $JAVA_HOME 来使用该版本的 JDK。

代码示例(shell):

#!/bin/bash

echo "JAVA_HOME is ${JAVA_HOME}"

"${JAVA_HOME}/bin/java" -version

# 假设你的 sonar-scanner 也在构建目录中,可以使用类似方式调用。
#"${JAVA_HOME}/bin/java" -jar /opt/sonar-scanner-4.8.0.2856-linux/bin/sonar-scanner-4.8.0.2856.jar   ... // 其他参数

说明:

  1. 该示例展示了设置任务级别的 JAVA_HOME,确保后续步骤使用特定的Java版本。
  2. 可以根据实际 sonar-scanner的路径以及配置修改命令内容。

安全建议: 注意硬编码的 JAVA_HOME路径。最好使用Jenkins配置的工具名称或者变量,方便后期维护,降低耦合性。另外如果外部路径,建议做好权限控制。

解决方法三: 直接在 SonarQube 扫描器插件配置中设置 Java Home (较少推荐)

原理: 这种方法直接在 SonarQube Scanner 的构建步骤中,设置使用的 JAVA_HOME。这种方案不够灵活,可能存在重复配置。建议采用前两种方案。

操作步骤:

  1. 进入你的jenkins任务的 “构建步骤” 或者 “build step” 中。
  2. 找到 SonarQube 扫描器步骤。
  3. 通常会有 JAVA HOME 选项或者配置输入,在里面指定JDK路径。

说明: 该方式虽然可以直接设置 JDK,但每个任务单独设置的方式效率不高,管理难度较高。不建议广泛使用。

安全建议: 该方案与方案二类似,需谨慎处理 JDK 路径。

以上几种方法均可有效解决 Jenkins SonarQube 扫描器 UnsupportedClassVersionError 错误。 根据具体需求和偏好选择合适的解决方案。通常情况下,设置 Jenkins 全局 JDK 是一种较为推荐的做法,它能保证整体构建环境的一致性和可维护性。请根据实际环境和需求进行适当的调整和优化。