当前位置: 首页 > news >正文

静态代码扫描工具 Sonar 配置及使用

概览

Sonar 是一个用于代码质量管理的开放平台。通过插件机制,Sonar 可以集成不同的测试工具,代码分析工具,以及持续集成工具。与持续集成工具(例如 Hudson/Jenkins 等)不同,Sonar 并不是简单地把不同的代码检查工具结果(例如 FindBugs,PMD 等)直接显示在 Web 页面上,而是通过不同的插件对这些结果进行再加工处理,通过量化的方式度量代码质量的变化,从而可以方便地对不同规模和种类的工程进行代码质量管理。

在对其他工具的支持方面,Sonar 不仅提供了对 IDE 的支持,可以在 Eclipse 和 IntelliJ IDEA 这些工具里联机查看结果;同时 Sonar 还对大量的持续集成工具提供了接口支持,可以很方便地在持续集成中使用 Sonar。此外,Sonar 的插件还可以对 Java 以外的其他编程语言提供支持,对国际化以及报告文档化也有良好的支持。

主要特点:

  • 代码覆盖:通过单元测试,将会显示哪行代码被选中
  • 改善编码规则
  • 搜寻编码规则:按照名字,插件,激活级别和类别进行查询
  • 项目搜寻:按照项目的名字进行查询
  • 对比数据:比较同一张表中的任何测量的趋势

SonarQube 安装与配置

Sonar 是 Codehaus 上面的一个开源项目,使用的是 LGPL V3 软件许可。我们可以在其官方网站上下载其源代码及安装包。下载网址为:Download | SonarQube | Sonar,LTS 版本是长期支持版本,后期会继续维护,是比较稳定的版本,因此,这里我们选择下载的是 LTS 版(V5.6.6)。注意:本版本的 SonarQube 需要 Java 8 及以上的环境,下载完毕压缩包后,解压到合适的目录下。打开软件的 bin 目录,如下图所示

根据自己的电脑系统,打开不同的目录。例如:我的电脑是 windows7 64 位,打开最下方的目录,运行 StartSonar.bat,然后在浏览器中访问:http://localhost:9000/ (SonarQube 默认访问地址),成功打开即说明,SonarQube 安装成功。如下图所示(已安装中文插件): 

SonarQube 的默认管理员账号是:admin,密码为:admin。登录后,可安装一些插件,帮助我们完成相应的任务,例如:中文语言插件、SonarJS 插件等。插件的安装,如下图所示:第一步点击左上角的 ”Administration”,跳转到 Administrator 界面。

在 Administrator 界面,下拉 Syetem 选项,点击 Update Center,会跳转到 Update Center 界面。在这个界面上,可以清楚的看到当前已安装了那些插件,如下图所示:

这里我们需要安装两个插件:一个中文语言包,一个 JS 静态代码扫描插件 SonarJs(如果已安装,需要更新到3.1.1.5128或更高版本)。

点击 “Available”,显示所有可以安装的插件,我们选择安装中文语言包 Chinese Pack 和 JS 静态代码扫描插件 SonarJS,如下图所示:

如果安装的过程中,出现无法下载的异常,如下图所示:

 

根据它提示的信息,到对应的网站下载该插件。下载完成后,把下载的 jar 包复制到 SonarQube 安装的目录 plugins 目录下,例如:E:\Program Files (x86)\sonarqube-5.6.6\extensions\plugins,然后重启 SonarQube,即可实现插件的安装。 

关于 SonarQube 重启,值得注意的是:除了需要关闭 SonarQube 控制台外,还需要调用任务管理器,把正在运行的 java.exe 进程都给杀死,然后再次运行 StartSonar.bat,方可重启SonarQube。经过以上软件和插件的安装,JS 代码静态扫描的环境已完成搭建,接下来就是根据不同的项目,设置不同的 SonarQube 配置项。对于 Android 混合应用,进行 JS 代码静态扫描,有两种工具以完成:使用 AS 的插件 SonarLint、使用 Sonar-Runner。无论使用哪种方式,都需要在 SonarQube 配置对应的项目,如下图所示:

 

 通过以上步骤,进入到项目配置界面,如下图所示:点击 Create Project,创建一个项目,其中 Name 和 Key 是必填项。如下图所示:

两种扫描方式

SonarLint 插件

打开 Android Studio(示例版本:2.3.3),打开 File-----Settings----Plugins----Browse Repositories,搜索 SonarLint,安装此插件,如下图所示:

接下来配置 SonarLint 插件:打开 File----Settings----Other Settings----SonarLint General Setting,添加一个 SonarQube服务,如下图所示: 

击 next,需要选择账号类型,及账户名与密码,如下图所示:

账户名与密码均为:admin,点击 next,完成 SonarQube 服务的设置,设置成功后,会出现以下界面,如图所示:

点击下方的 “Update binding”,更新 SonarQube 服务的配置信息。接着配置 SonarLint Project Settings,如下图所示:

下拉选择服务 “Sonar”,选择 SonarQube 服务创建的项目 ”hsdzda”,点击 apply,ok。通过以上配置,完成插件 SonarLint 的配置。接下来,指定项目进行静态代码扫描,如下图所示:

Sonar-Runner 工具

AS 插件扫描代码的方式,方便开发人员修改,但这并不适合测试人员进行 bug 的后期管理及后期接入 CI 中。使用 Sonar-Runner,可把扫描结果上报到 SonarQube 网站上,网站以图形化的效果进行展示,方便测试人员快速上报及bug后期管理。使用 Sonar-Runner 工具,需要先下载这个工具,并配置对应的环境变量,下载地址为:http://repo1.maven.org/maven2/org/codehaus/sonar/runner/sonar-runner-dist/2.4/sonar-runner-dist-2.4.zip,下载完成后,解压到合适的目录(不要包含中文)。打开电脑的高级系统配置,配置环境变量。新建一个系统环境变量,变量名为 ”SONAR_RUNNER”,变量值为刚才解压的文件目录,例如:E:\Program Files (x86)\sonar-runner-2.4。编辑系统环境变量path,添加 Sonar-Runner 的 path 变量值,例如:%SONAR_RUNNER_HOME%\bin; 点击确定。配置完成后,打开控制台,输入sonar-runner –h,然后回车,显示如下信息,即说明配置成功。

 在需要扫描的项目根目录下,创建一个名为 ”sonar-project.properties” 文件,配置信息如下所示: 

其中 sonar.projectKey 和 sonar.projectName 为之前 SonarQube 服务上的项目配置信息,必须要保持一致。Sonar.sources 为要扫描的目录,这里选择 assets 目录。打开 cmd 窗口,进入到待扫描项目的根目录下,执行命令 sonar-runner,回车,即开始静态代码扫描工作。如下图所示:  

扫描成功,会有以下提示:

打开浏览器,访问http://localhost:9000/ ,即可以图形化的效果,展示扫描结论,如下图所示:

具体的 bug 列表: 

需要注意的是:无论使用 SonarLint 插件,还是 Sonar-Runner 进行静态代码扫描,均要保持SonarQube 服务是运行的,才可对项目进行扫描

相关文章:

静态代码扫描工具 Sonar 配置及使用

概览 Sonar 是一个用于代码质量管理的开放平台。通过插件机制,Sonar 可以集成不同的测试工具,代码分析工具,以及持续集成工具。与持续集成工具(例如 Hudson/Jenkins 等)不同,Sonar 并不是简单地把不同的代…...

docker 03(docker 容器的数据卷)

一、数据卷的概念和作用 删除后,数据也没了。 不能 数据卷 是宿主机中的一个目录或文件当容器目录和数据卷目录绑定后,对方的修改会立即同步一个数据卷可以被多个容器同时挂载 作用: 容器数据持久化 外部机器和容器间接通信 容器之间数据交换…...

【04】基础知识:typescript中的类

一、es5 对象 1、定义 类(对象) 原型链上的属性和方法会被多个实例共享。构造函数中的属性和方法不会。 // 自定义构造函数 function Person(name, age) {this.name namethis.age agethis.getInfo function() {console.log(${this.name} - ${this.…...

CCClippingNode:在游戏中实现遮罩效果、剪切效果,以涂抹糖霜为例,如何更好的实现涂抹效果,提高用户的游戏体验

CCClippingNode:在游戏中实现遮罩效果、剪切效果,以涂抹糖霜为例,如何更好的实现涂抹效果 设备/引擎:Mac(11.6)/cocos2d-x 开发工具:Xcode(13.0) 开发需求&#xff1a…...

cuda gdb调试

如果cudaDeviceEnablePeerAccess函数不支持或不起作用,您仍然可以尝试其他方法来实现GPU之间的数据交换和通信。以下是一些替代方法: 通过主机内存进行数据传输: 如果GPU之间的数据交换不是非常频繁,您可以将数据从一个GPU复制到…...

【vim 学习系列文章 5 - cscope 过滤掉某些目录】

文章目录 cscope 过滤目录介绍 cscope 过滤目录介绍 第一步创建自己的cscope脚本~/.local/bin/cscope.sh,如下: function my_cscope() {CODE_PATHpwdecho "$CODE_PATH"echo "start cscope...."if [ ! -f "$CODE_PATH/cscope.…...

实验三 HBase1.2.6安装及配置

系列文章目录 文章目录 系列文章目录前言一、HBase1.2.6的安装二、HBase1.2.6的配置2.1 单机模式配置2.2 伪分布式模式配置 总结参考 前言 在安装HBase1.2.6之前,需要安装好hadoop2.7.6。 本篇文章参考:HBase2.2.2安装和编程实践指南 一、HBase1.2.6的安…...

LightDB sequence支持MAXVALUE最大值与Oracle相同

功能介绍 Oracle数据库在创建sequence的时候可以支持设置maxvalue 为9999999999999999999999999999,这样的SQL在LightDB23.3版本之前都是执行失败的。为了方便Oracle用户迁移到LightDB上,在LightDB23.3版本上,增加了sequence支持maxvalue设置…...

二、Kafka快速入门

目录 2.1 安装部署1、【单机部署】2、【集群部署】 2.2 Kafka命令行操作1、查看topic相关命令参数2、查看当前kafka服务器中的所有Topic3、创建 first topic4、查看 first 主题的详情5、修改分区数(注意:分区数只能增加,不能减少)…...

消息中间件-kafka实战-第五章-kafka重复消费、顺序消费及死信队列

目录 一、参考二、路由规则(分片规则)三、触发重复消费的场景场景一:触发rebalance问题描述可能原因实际影响参数在kafka0.10.1 之前:在kafka0.10.1之后:解决方案 场景二:服务宕机可能原因解决方案 消息幂等性 四、kaf…...

python爬虫9:实战2

python爬虫9:实战2 前言 ​ python实现网络爬虫非常简单,只需要掌握一定的基础知识和一定的库使用技巧即可。本系列目标旨在梳理相关知识点,方便以后复习。 申明 ​ 本系列所涉及的代码仅用于个人研究与讨论,并不会对网站产生不好…...

从业务层的代码出发,去排查通用框架代码崩溃的问题

目录 1、问题说明 1.1、Release下崩溃,Debug下很难复现 1.2、用Windbg打开dump文件,发现崩溃在通用的框架代码中 2、进一步分析 2.1、使用IDA查看汇编代码尝试寻找崩溃的线索 2.2、在Windbg中查看相关变量的值 2.3、查看最近代码的修改记录&#…...

LLM预训练大型语言模型Pre-training large language models

在上一个视频中,您被介绍到了生成性AI项目的生命周期。 如您所见,在您开始启动您的生成性AI应用的有趣部分之前,有几个步骤需要完成。一旦您确定了您的用例范围,并确定了您需要LLM在您的应用程序中的工作方式,您的下…...

[Machine Learning] 损失函数和优化过程

文章目录 机器学习算法的目的是找到一个假设来拟合数据。这通过一个优化过程来实现,该过程从预定义的 hypothesis class(假设类)中选择一个假设来最小化目标函数。具体地说,我们想找到 arg min ⁡ h ∈ H 1 n ∑ i 1 n ℓ ( X i…...

serialVersionUID 有何用途?如果没定义会有什么问题?

序列化是将对象的状态信息转换为可存储或传输的形式的过程。我们都知道,Java 对象是保持在 JVM 的堆内存中的,也就是说,如果 JVM 堆不存在了,那么对象也就跟着消失了。 而序列化提供了一种方案,可以让你在即使 JVM 停机…...

C# OpenCvSharp DNN 二维码增强 超分辨率

效果 项目 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using OpenCvSharp; using OpenCvSharp.Dnn; using OpenCvSh…...

this.$refs使用方法

深入理解和使用this.$refs——Vue.js的利器 Vue.js是一个流行的JavaScript框架,用于构建交互性强大的用户界面。在Vue.js中,this.$refs是一个强大的特性,允许你直接访问组件中的DOM元素或子组件实例。本教程将带你深入了解this.$refs的使用方…...

Ohio主题 - 创意组合和代理机构WordPress主题

Ohio主题是一个精心制作的多用途、简约、华丽、多功能的组合和创意展示主题,具有敏锐的用户体验,您需要构建一个现代且实用的网站,并开始销售您的产品和服务。它配备了最流行的WordPress页面构建器 WPBakery Page Builder(以前称为…...

mysql 、sql server trigger 触发器

sql server mySQL create trigger 触发器名称 { before | after } [ insert | update | delete ] on 表名 for each row 触发器执行的语句块## 表名: 表示触发器监控的对象 ## before | after : 表示触发的时间,before : 表示在事件之前触发&am…...

自然语言处理从入门到应用——LangChain:索引(Indexes)-[检索器(Retrievers)]

分类目录:《自然语言处理从入门到应用》总目录 检索器(Retrievers)是一个通用的接口,方便地将文档与语言模型结合在一起。该接口公开了一个get_relevant_documents方法,接受一个查询(字符串)并返…...

PHP和Node.js哪个更爽?

先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

Windows安装Miniconda

一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)

引言 工欲善其事,必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后,我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集,就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...

MySQL:分区的基本使用

目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...

CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!

本文介绍了一种名为AnomalyAny的创新框架,该方法利用Stable Diffusion的强大生成能力,仅需单个正常样本和文本描述,即可生成逼真且多样化的异常样本,有效解决了视觉异常检测中异常样本稀缺的难题,为工业质检、医疗影像…...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋

随着工业以太网的发展,其高效、便捷、协议开放、易于冗余等诸多优点,被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口,具有实时性、开放性,使用TCP/IP和IT标准,符合基于工业以太网的…...

DAY 26 函数专题1

函数定义与参数知识点回顾:1. 函数的定义2. 变量作用域:局部变量和全局变量3. 函数的参数类型:位置参数、默认参数、不定参数4. 传递参数的手段:关键词参数5 题目1:计算圆的面积 任务: 编写一…...

Vue 3 + WebSocket 实战:公司通知实时推送功能详解

📢 Vue 3 WebSocket 实战:公司通知实时推送功能详解 📌 收藏 点赞 关注,项目中要用到推送功能时就不怕找不到了! 实时通知是企业系统中常见的功能,比如:管理员发布通知后,所有用户…...