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
英文地址,請注明出處:http://en.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 系統的評…