使用sonar进行java代码质量管理

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介:

前言

应公司要求,这一次的开发需要进行sonar进行静态代码质量检测。
接到这个任务的时候,我还并不知道sonar是什么,但听到静态代码检测几个字的时候,我下意识的以为是类似checkstyle之类的工具,但是真正用过之后我发现我错了。
我发现实际运行的时候,似乎并不纯粹是静态,因为整个检测过程中还会连接数据库,还会发送http请求,还会连接svn等等。
用完之后,深感这个工具的好用,不检测不知道,一检测吓一跳,竟然检查出来了26个bugs,可靠性级别是像毒血一样的黑红E。
那么废话不再多说,进入主题,记录一下整个环境搭建和检测过程,以便备忘。

安装

安装主要是参考了一篇博文使用 Sonar 进行代码质量管理,不过有一些细节略有区别。

下载

执行git命令git clone git://github.com/SonarSource/sonar.git
前提是安装了git,我下载下来的sonar版本是6.5,本地jdk环境是1.8。

解压

这个就不用多说了

启动

在解压后的目录中一层层找到windows-x86-64StartSonar.bat,当然了,这里需要选择适合自己电脑操作系统的目录。
如果启动更不报错,就可以进行下一步。
我在第一次启动的时候没有启动成功,查看日志发现是h2内存数据库启动失败,然后想起来我电脑安装的有h2并设置了windows服务自动启动,所以端口占用,导致sonar里的h2启动失败,然后关闭了本机的h2之后,成功启动。

访问

浏览器访问localhost:9000,前提是启动不报错。

插件

在我参考的那篇博客里,安装完sonar之后就是装插件,我当时不知道那插件具体干嘛用的,就抱着试一试的心态,并没有安装,而是直接跳过了,而在保证完成手头工作的情况下,后续也没有再安装任何插件。

配置

sonar工作的时候,要使用到数据库,会把要检测的项目的代码导入到数据库中,所以必须进行数据库的配置,我这里是使用的mysql数据库。

创建sonar用户并授权

在一开始完全不会的情况下,我跟着上边博客一步步的做,以为必须是sonar用户,但后来看到其他一些博客中并没有用这个用户,想来应该其他用户也可以,不过我没有试。
创建用户命令CREATE USER sonar IDENTIFIED BY 'sonar';
用户授权命令GRANT ALL PRIVILEGES ON *.* TO 'sonar'@'localhost' \ IDENTIFIED BY 'sonar' WITH GRANT OPTION;

建库

创建一个给sonar用的mysql库,不用建表,sonar会自动建表,这一步就不多说了。

配置sonar.properties

代开sonar安装目录,也就是之前解压的目录,找到conf下的sonar.properties文件,编辑这个文件。

  1. 找到
     

sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false

这一行,原本是注释的,去掉注释。

  1. 找到sonar.jdbc.usernamesonar.jdbc.password,都填上sonar,如果上边建立用户那里不是sonar,可能需要改一下。
  2. 将 MySQL 的驱动文件(如 mysql-connector-java-5.1.34.jar)拷贝到 安装目录的extensionsjdbc-drivermysql 目录下,如果没有这些目录就自己创建。我的一开始没有mysql这个目录,就是自己创建的。

配置maven的settings.xml

<profiles></prifiles>加入如下配置


<profile>
<id>sonar</id>
<activation>
   &lt;activeByDefault>true&lt;/activeByDefault>

</activation>
<properties>

    &lt;sonar.jdbc.url>
    jdbc:mysql://localhost:3306/sonar
    &lt;/sonar.jdbc.url>
    &lt;sonar.jdbc.driver>com.mysql.jdbc.Driver&lt;/sonar.jdbc.driver>
    &lt;sonar.jdbc.username>sonar&lt;/sonar.jdbc.username>
    &lt;sonar.jdbc.password>sonar&lt;/sonar.jdbc.password>
   &lt;sonar.host.url>http://localhost:9000&lt;/sonar.host.url>

</properties>
</profile>


我上边参考的那个文档里 url写的是这样 jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8,但我这样配之后执行mvn命令报错,所以就去掉了后边一截。

进行代码检测

代码检测主要就是在cmd窗口执行了两个mvn的命令,分别是mvn clean installmvn sonar:sonar,如果这两个命令执行结果都是build success,基本上就没有问题了,而我在运行的过程中有遇到下边一些问题。

java_home的问题

被检测的项目使用的是jdk1.8,虽然我在cmd命令行窗口执行java -version结果也是1.8,但是环境变量的java_home配置却是1.6的路径,导致执行mvn命令的时候出现如下错误Unsupported major.minor version 52.0,把java_home换成1.8之后问题消失。

maven镜像的问题

由于我的maven配置的仓库镜像是阿里云的镜像,而公司最近封网,导致使用内网的时候执行mvn clean install命令,需要的插件无法下载,切换到外部网络之后问题解决。这些插件应该是只有第一次执行的时候才下载,后边继续用内网就没有问题。

数据库连接的问题

这里说的数据库不是sonar要用的mysql,而是项目里的数据库。
由于一开始以为静态代码检查跟数据库无关,因此项目里要连接的oracle数据库没有启动,导致执行上边命令的时候,因数据库连接不上而失败,启动oracle数据库后问题解决。

svn连接的问题

这个问题其实我还没太明白,因为项目里似乎并没有配置svn相关的东西,但是执行mvn sonar:sonar的时候,却因svn连接不上而失败,当切换网络连接上svn后,问题解决。

代码优化

上述问题都解决之后,使用localhost:9000访问之后,就可以看到我们要检查的项目。看到页面之后的操作,自己点一点鼠标就很容易明白,很容易找到有问题的代码具体的类,具体的行数等,甚至页面上还会给出优化方案,然后就可以根据具体显示出来的代码及优化方案进行优化了。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
4月前
|
设计模式 算法 Java
Java中的设计模式:提升代码质量的秘诀
【8月更文挑战第23天】在Java开发中,设计模式是提高代码可读性、可维护性和扩展性的强有力工具。本文通过浅显易懂的语言和实际案例,探讨几种常见的设计模式及其在Java中的应用,旨在帮助开发者更好地理解并运用这些模式来优化自己的代码结构。
58 2
|
4月前
|
IDE Java 测试技术
揭秘Java高效编程:测试与调试实战策略,让你代码质量飞跃,职场竞争力飙升!
【8月更文挑战第30天】在软件开发中,测试与调试对确保代码质量至关重要。本文通过对比单元测试、集成测试、调试技巧及静态代码分析,探讨了多种实用的Java测试与调试策略。JUnit和Mockito分别用于单元测试与集成测试,有助于提前发现错误并提高代码可维护性;Eclipse和IntelliJ IDEA内置调试器则能快速定位问题;Checkstyle和PMD等工具则通过静态代码分析发现潜在问题。综合运用这些策略,可显著提升代码质量,为项目成功打下坚实基础。
68 2
|
4月前
|
安全 Java 开发者
Java反射:Spring Boot背后的魔法,让你的代码质量飞跃的神秘力量!
【8月更文挑战第29天】Java反射机制允许程序在运行时访问和修改类、接口、方法等属性,而Spring Boot则广泛应用反射实现依赖注入和自动配置。本文探讨如何利用反射机制提升Spring Boot应用的代码质量,包括动态类型处理、元数据访问及依赖注入等方面。通过实战示例展示动态调用方法和自定义注解处理,强调反射机制对代码灵活性与扩展性的贡献,同时提醒开发者注意性能和安全问题。
122 0
|
5月前
|
JavaScript Java 测试技术
基于Java的人事管理系统设计和实现(源码+LW+部署讲解)
基于Java的人事管理系统设计和实现(源码+LW+部署讲解)
111 7
|
5月前
|
JavaScript Java 测试技术
基于Java的儿童福利院管理系统设计和实现(源码+LW+部署讲解)
基于Java的儿童福利院管理系统设计和实现(源码+LW+部署讲解)
107 7
|
5月前
|
缓存 安全 Java
Java中线程池如何管理?
【7月更文挑战第11天】Java中线程池如何管理?
58 2
|
5月前
|
存储 监控 算法
Java中如何管理内存?
【7月更文挑战第10天】Java中如何管理内存?
62 2
|
5月前
|
设计模式 缓存 安全
Java面试题:工厂模式与内存泄漏防范?线程安全与volatile关键字的适用性?并发集合与线程池管理问题
Java面试题:工厂模式与内存泄漏防范?线程安全与volatile关键字的适用性?并发集合与线程池管理问题
64 1
|
5月前
|
Java 调度 Spring
Java中的定时任务调度与管理
Java中的定时任务调度与管理
|
5月前
|
JavaScript 前端开发 Java
Java语言+前后端分离 数字化产科管理平台 产科电子病历系统源码
Java开发的数字化产科管理系统,已在多家医院实施,支持直接部署。系统涵盖孕产全程,包括门诊、住院、统计和移动服务,整合高危管理、智能提醒、档案追踪等功能,与HIS等系统对接。采用前后端分离架构,Java语言,Vue前端,MySQL数据库。优势在于提升就诊效率,降低漏检率,自动报表生成,减少重复工作,支持数据研究,并实现医院与卫计委平台的数据互通,打造全生育周期健康服务。
71 0
下一篇
DataWorks