由于 SonarQube 与 Java 8 的兼容性问题,Jenkins 管道失败 - 如何动态使用 Java 11 进行声纳分析?

问题描述 投票:0回答:1

我在运行涉及 SonarQube (9.9) 分析的 Jenkins 管道时遇到问题。该作业在运行 Java 8 的 Jenkins 从机上失败。以下是错误消息:

[ERROR] Failed to execute goal org.sonarsource.scanner.maven:sonar-maven-plugin:4.0.0.4121:sonar (default-cli) on project BillDeskIntegrationService: 
Execution default-cli of goal org.sonarsource.scanner.maven:sonar-maven-plugin:4.0.0.4121:sonar failed: 
Unable to load the mojo 'sonar' in the plugin 'org.sonarsource.scanner.maven:sonar-maven-plugin:4.0.0.4121' due to an API incompatibility: 
org.codehaus.plexus.component.repository.exception.ComponentLookupException: org/sonarsource/scanner/maven/SonarQubeMojo 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

该错误表明Sonar Maven插件需要Java 11(类文件版本55.0),但Jenkins从属运行的是Java 8,它仅支持最高52.0的类文件版本。

我对于将整个 Jenkins 从属升级到 Java 11 犹豫不决,因为它可能会引入与依赖于 Java 8 的其他 Maven 构建的兼容性问题。

我的 SonarQube 9.9 在 Java 17 的单独实例中运行。

此外,我还有另一个安装了 Java 8 和 Java 11 的 Jenkins Slave。有没有办法配置我的 Jenkins 管道或 Maven 作业,以根据工具动态选择适当的 Java 版本(例如,用于 SonarQube 分析的 Java 11 和用于构建其他部分的 Java 8)?

14:13:19  [WARNING] Failed to retrieve plugin descriptor for org.apache.maven.plugins:Maven-surefire-plugin:2.19.1: 
Plugin org.apache.maven.plugins:Maven-surefire-plugin:2.19.1 or one of its dependencies could not be resolved: 
Failure to find org.apache.maven.plugins:Maven-surefire-plugin:jar:2.19.1 in https://artifactory.bfsgodirect.com/repository/BFDL_PROXY/ 
was cached in the local repository, resolution will not be reattempted until the update interval of BFDL_PROXY has elapsed or updates are forced
...
14:13:19  [INFO] --- sonar-maven-plugin:4.0.0.4121:sonar (default-cli) @ BillDeskIntegrationService ---
...
14:13:20  [ERROR] Failed to execute goal org.sonarsource.scanner.maven:sonar-maven-plugin:4.0.0.4121:sonar (default-cli) on project BillDeskIntegrationService: 
Execution default-cli of goal org.sonarsource.scanner.maven:sonar-maven-plugin:4.0.0.4121:sonar failed: 
Unable to load the mojo 'sonar' in the plugin 'org.sonarsource.scanner.maven:sonar-maven-plugin:4.0.0.4121' due to an API incompatibility: 
org.codehaus.plexus.component.repository.exception.ComponentLookupException: org/sonarsource/scanner/maven/SonarQubeMojo 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
14:13:20  [ERROR] -----------------------------------------------------

对于如何在不破坏当前设置的情况下解决此问题的任何建议,我将不胜感激。

我在同一个 Jenkins Slave 上同时存在 Java 8 和 Java 11,但在运行管道时仍然面临相同的错误。

是否可以在同一个管道脚本中运行两个不同的Java版本? 如何修复 SonarQube 9.9 与 Java 8 从站的兼容性?

java sonarqube
1个回答
0
投票

您的整个 Maven 构建必须使用 Java 11 或更高版本运行。您无法使用 Java 8 运行 Maven 构建的一部分,而使用 Java 11 运行其他部分。但是,您可以做的是执行 2 个构建:一个使用不包含 SonarQube 的 Java 8,另一个使用仅运行的 Java 11声纳Qube。要使用现有的测试和覆盖率报告,建议在常规构建之后运行此报告,并且不要

clean

要使其正常工作,您需要将 Java 11 配置为 Jenkins 内的工具。对我来说,最简单的方法是包含一个安装程序(我更喜欢 Adoptium),这样,如果需要,将安装 JDK,与运行 Jenkins 的 JDK 分开。

假设您有一个(多分支)管道作业,通常的第一步是定义全局工具:

pipeline {
    ...
    tools {
        jdk 'jdk-8'     // or whatever the identifier is
        maven 'maven-3' // or whatever the identifier is
    }
    ...
}

这使得

java
mvn
在整个管道中可用。这是我们现在必须偏离的地方,但仅限于需要不同版本的部分。

在 SonarQube 的构建中,您需要定义一个不同的工具。如果可用,您可以使用

withMaven

// The publisherStrategy prevents build artifacts to be added as Jenkins artifacts
withMaven(jdk: 'jdk-11', maven: 'maven-3', publisherStrategy: 'EXPLICIT') {
    ...
}

如果不可用(由于缺少插件),您仍然可以使用

tool
withEnv
:

withEnv(["JAVA_HOME=${tool('jdk-11')}"]) {
    // $JAVA_HOME is now that of Java 11, so Maven will use Java 11
    // To run a different Maven that's also possible:
    sh "${tool('maven-3')}/bin/mvn --version"
}

tool
函数会根据需要安装该工具,并返回其基本路径。我经常在 Java 版本不固定的可配置管道中使用它。

© www.soinside.com 2019 - 2024. All rights reserved.