当前位置: 首页 > 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方法,接受一个查询(字符串)并返…...

春秋云境:CVE-2022-0543(Redis 沙盒逃逸漏洞)

目录 一、i春秋题目 二、CVE-2022-0543:(redis沙盒逃逸) 漏洞介绍: 漏洞复现: 一、i春秋题目 靶标介绍: Redis 存在代码注入漏洞,攻击者可利用该漏洞远程执行代码。 进入题目:…...

关于uniapp组件的坑

关于uniapp组件的坑 我有一个组件写的没什么问题,但是报下面这个错误 is not found in path “components/xxx/xxxx” (using by “components/yyy/yyy”) 最后经过排除发现命名需要驼峰命名法 我原本组件命名: 文件夹名 test_tttt 文件名 test_tttt.vue 不行 最后改成文件…...

AIGC与软件测试的融合

一、ChatGPT与AIGC 生成式人工智能——AIGC(Artificial Intelligence Generated Content),是指基于生成对抗网络、大型预训练模型等人工智能的技术方法,通过已有数据的学习和识别,以适当的泛化能力生成相关内容的技术。…...

滑动验证码-elementui实现

使用elementui框架实现 html代码 <div class"button-center"><el-popoverplacement"top":width"imgWidth"title"安全验证"trigger"manual"v-model"popoverVisible"hide"popoverHide"show&quo…...

ubuntu 20.04 安装 高版本cuda 11.7 和 cudnn最新版

一、安装显卡驱动 参考另一篇文章&#xff1a;Ubuntu20.04安装Nvidia显卡驱动教程_ytusdc的博客-CSDN博客 二、安装CUDA 英伟达官网&#xff08;最新版&#xff09;&#xff1a;CUDA Toolkit 12.2 Update 1 Downloads | NVIDIA Developer CUDA历史版本下载地址&#xff1a;C…...

svg图片如何渲染到页面,以及svg文件的上传

svg图片渲染到页面的几种方式 背景&#x1f7e1;require.context获取目录下的所有文件&#x1f7e1;方式1: 直接在html中渲染&#x1f7e1;方式: 发起ajax请求&#xff0c;获取SVG文件 背景 需要实现从本地目录下去获取所有的svg图标进行预览&#xff0c;将选中的图片显示在另…...

GPT-LLM-Trainer:如何使用自己的数据轻松快速地微调和训练LLM

一、前言 想要轻松快速地使用您自己的数据微调和培训大型语言模型&#xff08;LLM&#xff09;&#xff1f;我们知道训练大型语言模型具有挑战性并需要耗费大量计算资源&#xff0c;包括收集和优化数据集、确定合适的模型及编写训练代码等。今天我们将介绍一种实验性新方法&am…...

深入理解ForkJoin

任务类型 线程池执行的任务可以分为两种&#xff1a;CPU密集型任务和IO密集型任务。在实际的业务场景中&#xff0c;我们需要根据任务的类型来选择对应的策略&#xff0c;最终达到充分并合理地使用CPU和内存等资源&#xff0c;最大限度地提高程序性能的目的。 CPU密集型任务 …...

Spring5学习笔记—AOP编程

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; Spring专栏 ✨特色专栏&#xff1a; M…...

适用于 Docker 用户的 kubectl

适用于 Docker 用户的 kubectl 你可以使用 Kubernetes 命令行工具 kubectl 与 API 服务器进行交互。如果你熟悉 Docker 命令行工具&#xff0c; 则使用 kubectl 非常简单。但是&#xff0c;Docker 命令和 kubectl 命令之间有一些区别。以下显示了 Docker 子命令&#xff0c; 并…...

做网站需要考虑哪些问题/综合权重查询

继续上一篇完成SCVMM创建SQL服务模板后&#xff0c;本篇将继续讲述云平台中的第一个组件——SCVMM创建第一个Web服务模板&#xff08;即下图中的SCVMM01&#xff0c;蓝色为未实现&#xff0c;绿色为计划中&#xff0c;红色为实施中&#xff09;。 1、 登录SCVMM控制台&#xf…...

做爰全过程教育网站/西安网络优化大的公司

你可以用CSS来完成。 看到这个简单的例子http://jsfiddle.net/rHSmV/(代码粘贴在下面)。进行更深入的示例/* Use a checkbox to workaround showing and hiding */input[typecheckbox] {position: absolute;top: -9999px;left: -9999px;}label {cursor: pointer;}/* Shown */di…...

关于二手书的网站开发ppt/百度sem运营

很多企业都会使用Linux系统&#xff0c;审计Linux系统日志可以提供有关网络事件的重要信息。高效查看Linux系统日志对工作而言十分重要&#xff0c;以下是常用命令# uname -a # 查看内核/操作系统/CPU信息# cat /etc/issue# cat /etc/redhat-release # 查看操作系统版本# cat /…...

什么是网络营销?网络营销有哪些特点?/北京网站营销seo方案

2015年07月08日 1、对于 IOS6 导航栏背景图片为 44 则2x 得设计为 88 2、对于 IOS7 导航栏背景图片为 64 则2x 得设计为 128 出现以上差异原因是由于IOS6里面&#xff0c;状态栏20是不包括在导航栏里面的&#xff0c;而 IOS7是包含在导航栏里面的。 3、 修改状态栏的文字颜色&…...

一个简单的html个人简历代码/江苏网站seo

iPhone从诞生之初&#xff0c;信号问题仿佛都是一直围绕这个系列的产品&#xff0c;一直没有得到彻底解决。iPhone用户也早已习惯了&#xff0c;这手机的信号的不好不差&#xff0c;好多都只能自嘲一句&#xff0c;又不是不能用。不过这个问题可能会在下一代iPhone上得到解决&a…...

集团高端网站/整站seo排名

制作一个Ring Menu需要有以下基础&#xff1a; 1. 熟练掌握元素的布局与定位&#xff1b; 2. 熟练掌握对元素边框的处理&#xff1b; 3. 熟练掌握伪类:hover的应用&#xff1b; 4. 熟练掌握子选择器的应用&#xff1b; 5. 熟练掌握背景处理&#xff1b; 6. 熟练掌握2D变换…...