Sonarqube:Jenkins触发sonar扫描出现UnsupportedClassVersionError错误处理

文章目录

    • 1、问题现象
    • 2、问题根因
    • 3、解决思路
      • 3.1 解决思路1
      • 3.2 解决思路2
      • 3.3 解决思路3

1、问题现象

问题现象:在每次Jenkins触发sonar扫描时,Sonar-scanner扫描器执行都会出现UnsupportedClassVersionError异常,如下:
在这里插入图片描述

ERROR: Error during SonarQube Scanner execution
java.lang.UnsupportedClassVersionError: org/sonar/batch/bootstrapper/EnvironmentInformation 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.0at java.base/java.lang.ClassLoader.defineClass1(Native Method)at java.base/java.lang.ClassLoader.defineClass(Unknown Source)at java.base/java.security.SecureClassLoader.defineClass(Unknown Source)at java.base/java.net.URLClassLoader.defineClass(Unknown Source)at java.base/java.net.URLClassLoader$1.run(Unknown Source)at java.base/java.net.URLClassLoader$1.run(Unknown Source)at java.base/java.security.AccessController.doPrivileged(Native Method)at java.base/java.net.URLClassLoader.findClass(Unknown Source)at org.sonarsource.scanner.api.internal.IsolatedClassloader.loadClass(IsolatedClassloader.java:82)at java.base/java.lang.ClassLoader.loadClass(Unknown Source)at org.sonarsource.scanner.api.internal.batch.DefaultBatchFactory.createBatch(DefaultBatchFactory.java:32)at org.sonarsource.scanner.api.internal.batch.BatchIsolatedLauncher.execute(BatchIsolatedLauncher.java:46)at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)at java.base/java.lang.reflect.Method.invoke(Unknown Source)at org.sonarsource.scanner.api.internal.IsolatedLauncherProxy.invoke(IsolatedLauncherProxy.java:60)at com.sun.proxy.$Proxy0.execute(Unknown Source)at org.sonarsource.scanner.api.EmbeddedScanner.doExecute(EmbeddedScanner.java:189)at org.sonarsource.scanner.api.EmbeddedScanner.execute(EmbeddedScanner.java:138)at org.sonarsource.scanner.cli.Main.execute(Main.java:112)at org.sonarsource.scanner.cli.Main.execute(Main.java:75)at org.sonarsource.scanner.cli.Main.main(Main.java:61)
ERROR: 
ERROR: Re-run SonarQube Scanner using the -X switch to enable full debug logging.

2、问题根因

这个问题表现在于扫描环境中java版本的错误,要求执行sonar-scannerJava版本 >= Java17(class version 61),但当前环境实际Java版本为Java11(class version 55),存在不支持的类,所以报错。这个问题本身很好解决,重新配置java环境变量即可,但这里面有个坑,配置的环境变量可能会不生效,需要专门的来说一下。

根因具体有几方面

  • 1、系统默认的Java版本为Java11,导致sonar-scanner执行失败
  • 2、sonar-scanner.properties配置文件指定了Java11的版本
  • 3、sonar-scanner执行时使用了内嵌Java,并且版本为Java11(重点)

3、解决思路

3.1 解决思路1

针对第1点: 直接重新配置执行时的环境变量即可,刷新Java生效的环境。

通过在Execute shell中指定重新配置Java环境变量,添加的时候必须将PATH一起配置,否则,当PATH路径中Java11版本的配置排列在Java17之前,会被优先索引到并采用:

export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
export PATH=${JAVA_HOME}/bin:$PATH

在这里插入图片描述

3.2 解决思路2

针对第2点: 需要对sonar-scanner.properties中设置进行修正,将其指定为Java17的版本。

配置文件路径通常为/opt/sonarqube/sonar-scanner/conf/sonar-scanner.properties

配置内容如下:

sonar.scanner.javaHome=/usr/lib/jvm/java-17-openjdk-amd64

注意: sonar.scanner.javaHome的参数支持,需要要求sonar-scanner版本>=4.12,将sonar-scanner.properties配置完成之后,最好再根据第1点,在执行前指定Java17,sonar-scanner.properties的作用通常在执行扫描时生效。

3.3 解决思路3

针对第3点:这里面埋了个大坑,sonar-scanner脚本本身会指定Java版本,当内嵌的版本为Java11时,外部所有其他方式指定的Java配置均不生效。

检查sonar-scanner执行脚本,文件路径在这/opt/sonarqube/sonar-scanner/bin/sonar-scanner,在下面几句会指明是否使用内嵌的Java:

use_embedded_jre=true
if [ "$use_embedded_jre" = true ]; thenexport JAVA_HOME=$sonar_scanner_home/jre
fi

use_embedded_jre变量值为true时,会直接采用内嵌的java版本,将内嵌的jre路径导入export JAVA_HOME=$sonar_scanner_home/jre这一项的优先级高于其他所有的配置。当此配置为true时,我们在第1点、第2点中所修改的内容都将不生效。

解决方法: 直接修改sonar-scanner执行脚本,将use_embedded_jre设置为false,其他无需更改,即修改为如下内容:

use_embedded_jre=false
if [ "$use_embedded_jre" = true ]; thenexport JAVA_HOME=$sonar_scanner_home/jre
fi

这样就默认不会采用内嵌的Java,之后再结合第1点的配置调整环境变量。重新触发构建,可正常进行扫描:

在这里插入图片描述

如果没有Jenkins服务器权限,可以在Jenkins配置中新建Execute shell,填入以下指令,直接在命令行对sonar-scanner进行修改:除了改动use_embedded_jre值外,其他原封不动粘贴

cat << 'EOF' > /opt/sonarqube/sonar-scanner/bin/sonar-scanner
#!/bin/sh
#
# SonarQube Scanner Startup Script for Unix
#
# Optional ENV vars:
#   SONAR_SCANNER_OPTS - Parameters passed to the Java VM when running the SonarQube Scanner
#   SONAR_SCANNER_DEBUG_OPTS - Extra parameters passed to the Java VM for debugging
#   JAVA_HOME - Location of Java's installationreal_path () {target=$1(while true; docd "$(dirname "$target")"target=$(basename "$target")test -L "$target" || breaktarget=$(readlink "$target")doneecho "$(pwd -P)/$target")
}script_path=$(real_path "$0")
sonar_scanner_home=$(dirname "$script_path")/..# make it fully qualified
sonar_scanner_home=$(cd "$sonar_scanner_home" && pwd -P)jar_file=$sonar_scanner_home/lib/sonar-scanner-cli-4.2.0.1873.jar# check that sonar_scanner_home has been correctly set
if [ ! -f "$jar_file" ] ; thenecho "File does not exist: $jar_file"echo "'$sonar_scanner_home' does not point to a valid installation directory: $sonar_scanner_home"exit 1
fiuse_embedded_jre=false
if [ "$use_embedded_jre" = true ]; thenexport JAVA_HOME=$sonar_scanner_home/jre
fiif [ -n "$JAVA_HOME" ]
thenjava_cmd="$JAVA_HOME/bin/java"
elsejava_cmd="$(which java)"
fiif [ -z "$java_cmd" -o ! -x "$java_cmd" ] ; thenecho "Could not find 'java' executable in JAVA_HOME or PATH."exit 1
fiproject_home=$(pwd)#echo "Info: Using sonar-scanner at $sonar_scanner_home"
#echo "Info: Using java at $java_cmd"
#echo "Info: Using classpath $jar_file"
#echo "Info: Using project $project_home"exec "$java_cmd" \-Djava.awt.headless=true \$SONAR_SCANNER_OPTS \$SONAR_SCANNER_DEBUG_OPTS \-classpath  "$jar_file" \-Dscanner.home="$sonar_scanner_home" \-Dproject.home="$project_home" \org.sonarsource.scanner.cli.Main "$@"
EOF

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/86346.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/86346.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spark SQL to_json 函数介绍

目录 前言函数介绍参数说明示例 前言 在Apache Hive中&#xff0c;并没有内置的to_json函数。在Apache Spark SQL中确实有to_json函数,它可以用来将结构化数据&#xff08;如结构化类型或MAP类型&#xff09;转换为JSON字符串。这个功能对于需要将表格数据输出为JSON格式的场景…

《解锁前端潜力:自动化流程搭建秘籍》

当项目逐渐从萌芽走向繁茂&#xff0c;中期阶段对流程优化与效率提升的需求便愈发迫切。搭建一套自动化测试、持续集成与部署的完整流程&#xff0c;已然成为突破瓶颈、保障代码质量与上线效率的关键密钥。这不仅是技术的进阶&#xff0c;更是思维与协作模式的革新。在踏上构建…

计算机体系结构中的片上系统SoC是什么?

计算机体系结构中的片上系统SoC是什么&#xff1f; 片上系统&#xff08;SoC&#xff0c;System on Chip&#xff09; 是一种将计算机或其他电子系统的多个关键组件集成到单一芯片上的集成电路设计。它不仅仅是处理器&#xff08;CPU&#xff09;&#xff0c;而是将处理器、内…

linux虚拟机基础-磁盘扩容详细版本模拟实验

扩容实验参考上一篇博客&#xff1a; https://blog.csdn.net/wenxiaocsdn/article/details/141932877?spm1001.2014.3001.5502 LVM基础知识附录红帽官方文档 配置和管理逻辑卷 | Red Hat Enterprise Linux | 8 | Red Hat Documentation LVM逻辑结构图 LVM 管理命令速查表&…

hbase高可用部署

要实现HBase集群的高可用部署&#xff08;High Availability, HA&#xff09;&#xff0c;核心在于消除单点故障&#xff08;特别是HMaster节点&#xff09;&#xff0c;并确保数据冗余和服务自动恢复。以下是、关键步骤和配置要点&#xff1a; 一、核心配置步骤‌ ‌1.1 启用…

STM32F103ZET6开发板【项目工程创建】+具体实现步骤流程

硬件介绍 芯片为STM32F103ZET6 STM32F103 资源简介 STM32 的优异性 1&#xff0c;超低的价格。8 位机的价格&#xff0c;32 位机的性能&#xff0c;是 STM32 最大的优势。 2&#xff0c;超多的外设。STM32 拥有包括&#xff1a;FMC、TIMER、SPI、IIC、USB、CAN、IIS、SDIO、…

CyberGlove触觉反馈手套遥操作机器人灵巧手解决方案

CyberGlove触觉反馈手套确实可以实时捕捉运动信号和触觉反馈&#xff0c;并将其重新定位到人形机器人上。CyberGlove触觉反馈手套遥操作机器人是通过手套上的传感器捕捉手部动作&#xff0c;将信号传输给机器人&#xff0c;同时接收机器人反馈的触觉信息&#xff0c;实现远程操…

[C#]C# winform部署yolov13目标检测的onnx模型

yolov13官方框架&#xff1a;github.com/iMoonLab/yolov13/releases/tag/yolov13 【测试环境】 vs2019 netframework4.7.2 opencvsharp4.8.0 onnxruntime1.16.3 【效果展示】 【调用代码】 using System; using System.Collections.Generic; using System.ComponentMode…

创客匠人 AI 赋能:创始人 IP 打造的效率革命与信任重构

在注意力经济时代&#xff0c;创始人 IP 面临内容生产效率与信任构建的双重挑战。创客匠人 2025 年战略升级为 “IP 变现整体解决方案服务商”&#xff0c;其推出的 AI 销售信、免训数字人、智能客服三大工具&#xff0c;正通过技术重构破解行业痛点&#xff0c;为知识变现开辟…

飞轮储能VSG控制策略辅助双馈风机一次调频的仿真模型研究

以下是为您撰写的《飞轮储能VSG控制策略辅助双馈风机一次调频的仿真模型研究》技术报告,包含完整的理论分析、控制策略设计及MATLAB/Simulink仿真实现细节: 飞轮储能VSG控制策略辅助双馈风机一次调频的仿真模型研究 摘要 针对双馈感应发电机(DFIG)参与电网一次调频时存在…

临床开发计划:从实验室到市场的战略蓝图

一、临床开发计划概述 1.1 定义与重要性 1.1.1 CDP核心定义 临床开发计划(CDP)是药物、生物制品或医疗器械从实验室走向市场的核心路线图,详细规划临床研究及其策略、时间表和资源需求,以满足监管机构审批要求。 1.1.2 指导意义 CDP为开发团队提供清晰指引,指导资源规划…

【大模型实战】微调Qwen2.5 VL模型,增强目标检测任务。

文章目录 制作数据集使用微调的模型制作数据集 制作数据集 这个章节将详细解析一个将Labelme标注数据集转换为Qwen2.5-VL模型训练格式的Python脚本。该工具实现了图像大小调整、边界框坐标转换和数据格式标准化等功能。生成适用Qwen2.5-VL的数据集。 核心功能概述 图像处理&a…

【python实用小脚本-118】基于Flask的用户认证系统:app.py、forms.py与user.py解析

在当今的网络应用中&#xff0c;用户认证是一个不可或缺的功能。无论是社交平台、电商平台还是企业管理系统&#xff0c;都需要确保只有授权用户才能访问特定的资源。本文将详细介绍一个基于 Flask 框架的用户认证系统&#xff0c;该系统由三个主要文件组成&#xff1a;app.py、…

phpstudy apache伪静态.htaccess文件置空丢失问题解决

phpstudy apache伪静态.htaccess文件置空丢失 在使用phpstudy本地部署项目的时候&#xff0c;创建网站-根目录选择public等运行目录&#xff0c;并且点击确认后&#xff0c;会碰到原本项目中的apache伪静态.htaccess文件被置空丢失的问题&#xff0c;导致项目无法正常访问。 解…

【thinkphp5】Session和Cache记录微信accesstoken

记录一个项目实际遇到的坑&#xff0c;不要把token存放在session&#xff0c;要存在在cache里面&#xff01;&#xff01; 因为Session并不能设置expire过期时间&#xff0c;Session::set()方法第三个参数是作用域&#xff0c;而非过期时间&#xff01;&#xff01;&#xff0…

网络协议完全指南:从HTTP长短连接到TCP-UDP的深度对话

&#x1f310; 网络协议完全指南&#xff1a;从HTTP长短连接到TCP-UDP的深度对话 本文采用对话形式&#xff0c;通过小李和小王的问答&#xff0c;深入浅出地讲解网络协议、长短连接等核心概念&#xff0c;帮助读者建立完整的网络知识体系。 引言 在Java后端开发中&#xff0c…

04-StarRocks集群运维FAQ

StarRocks集群运维FAQ 概述 本文档整理了StarRocks集群运维过程中常见的问题和解决方案,涵盖了集群管理、节点维护、监控告警、故障处理等各个方面,帮助运维人员高效管理StarRocks集群。 集群管理FAQ Q1: 如何查看集群状态? A: 集群状态查看方法: 1. 查看FE节点状态 …

通过Prompt提示构建思维链

《DEEPSEEK原生应用与智能体开发实践 王晓华 书籍 图书》【摘要 书评 试读】- 京东图书 思维链技术开启了人工智能通向人类智能的崭新路径。它让模型不再仅仅是机械地执行指令&#xff0c;而是开始具备类似人类的思考方式&#xff0c;能够理解问题的本质&#xff0c;进行深层次…

OpenCV边缘填充方式详解

一、边缘填充概述 在图像处理中&#xff0c;边缘填充&#xff08;Border Padding&#xff09;是一项基础而重要的技术&#xff0c;特别是在进行卷积操作&#xff08;如滤波、边缘检测等&#xff09;时&#xff0c;处理图像边缘像素需要用到周围的像素值。由于图像边缘的像素没…

如何评估RAG系统?全面指标体系

构建一个可靠的 检索增强生成&#xff08;Retrieval-Augmented Generation, RAG&#xff09;系统&#xff0c;不仅要关注模型的构建&#xff0c;更重要的是对系统性能进行科学、系统的评估。评估不仅衡量系统的效果&#xff0c;也为迭代优化提供依据。 本文将围绕 RAG 系统的评…