这两天在服务器上面安装Sonar,因为版本匹配问题,多花了一点点时间。今天终于把项目的分析结果上传到Sonar本地服务器上,特此对过程中出现过的问题做一个记录。
首先说明SonarQube(Sonar)是什么东西,有什么用:
Sonar 是一个开源平台,开源地址为:http://www.oschina.net/p/sonar/?fromerr=Unur081u ,用于管理源代码的质量。通过插件机制,Sonar 可以集成不同的测试工具,代码分析工具,以及持续集成工具。 与持续集成工具(例如 Hudson/Jenkins 等)不同,Sonar 并不是简单地把不同的代码检查工具结果(例如 FindBugs,PMD 等)直接显示在 Web 页面上,而是通过不同的插件对这些结果进行再加工处理,通过量化的方式度量代码质量的变化,从而可以方便地对不同规模和种类的工程进行代码质量管理。
在对其他工具的支持方面,Sonar 不仅提供了对 IDE 的支持,可以在 Eclipse 和 IntelliJ IDEA 这些工具里联机查看结果;同时 Sonar 还对大量的持续集成工具提供了接口支持,可以很方便地在持续集成中使用 Sonar。
此外,Sonar 的插件还可以对 Java 以外的其他编程语言提供支持,对国际化以及报告文档化也有良好的支持。
Sonar的下载和安装:
Sonar的官网Sonar;目前最新的版本是6.3
在这儿要特别说明的是不同的版本匹配不同的jdk,比如6.3就必须要求jdk1.8以上,不然就会报各种启动异常的问题。
Sonar的下载地址为:https://www.sonarqube.org/downloads/ ;由于和maven配合使用的原因,我本次下载的是Sonar 5.1.2版本,该版本要求jdk为1.7以上,实际服务器jdk版本为JDK1.8.
下载后解压缩 sonarqube-5.1.2 .zip文件得到sonarqube-5.1.2文件夹,在保证安装好jdk1.7版本的情况下,进入sonarqube-5.1.2\bin\windows-x86-64目录,执行 StartSonar.bat 没有报错的情况下,启动成功后访问:http://localhost:9000 ,如果能正常打开页面说明安装Sonar成功了。(当执行成功后,手动关闭StartSonar.bat 的执行窗口,实际上在系统中不会退出,还在运行,这点有点不合理,也让我在汉化和配置数据库源的时候再次执行 StartSonar.bat不成功,最后还是重启电脑才可以启动)
为Sonar配置mysql数据源和汉化设置
配置mysql数据源
推荐使用MySQL(默认会使用sonar内置的数据库)
CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE USER 'sonar' IDENTIFIED BY 'sonar';
GRANT ALL ON sonar.* TO 'sonar'@'%' IDENTIFIED BY 'sonar';
GRANT ALL ON sonar.* TO 'sonar'@'localhost' IDENTIFIED BY 'sonar';
执行完以后,可以在mysql数据库中看到对应的数据库,但是此时还没有表,相应的表要在修改了Sonar的配置文件后,第一次启动Sonar的时候初始化进行新建的Sonar数据库。在这次我们的mysql数据库版本为 5.6.19(在此之前我试过用原来的root账号建立sonar2016的数据库,没有给root再另外赋权限,Sonar启动报错,最好还是按照上面提示的语句来弄,另外Sonar不同版本对mysql的版本也有要求,不匹配的版本也是会启动错误的!)
Sonar数据库文件配置: sonarqube-5.1.2\conf下面的sonar.properties
修改的配置项为:
sonar.jdbc.username=sonar
sonar.jdbc.password=sonar
#----- Embedded Database (default)
# It does not accept connections from remote hosts, so the
# server and the analyzers must be executed on the same host.
#sonar.jdbc.url=jdbc:h2:tcp://localhost:9092/sonar
# H2 embedded database server listening port, defaults to 9092
#sonar.embeddedDatabase.port=9092
#----- MySQL 5.x
# Only InnoDB storage engine is supported (not myISAM).
# Only the bundled driver is supported.
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance
sonar.search.javaOpts=-Xmx1G -Xms256m -Xss256k -Djava.net.preferIPv4Stack=true
Sonar汉化
Sonar的汉化的话需要对应的jar包,这儿也要注意的是不同的Sonar版本对应的汉化包的版本也不一样:
汉化包下载地址: https://github.com/SonarQubeCommunity/sonar-l10n-zh 。这儿5.1.2版本的Sonar可以适用1.8版本的汉化包。
把对应的jar包下载会本地后,把它(sonar-l10n-zh-plugin-1.8.jar)拷贝在目录 sonarqube-5.1.2\extensions\plugins
当配置好数据库源和汉化以后,再重新启动Sonar,这时候时间会多花一些,因为有很多表会初始化到数据库中,成功启动后再登录就可以看到熟悉的中文了。
Maven工程上传代码检测结果到Sonar服务器
maven服务的 settings.xml的配置修改
修改apache-maven-3.2.2\conf文件下面的settings.xml,红色部分对应安装Sonar服务的地址和该Sonar服务所使用的mysql地址和账号信息。因为我是本地和服务器都装了Sonar和对应的数据库,所以我注释掉了一个。
<profile>
<id>sonar</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<sonar.jdbc.url>
jdbc:mysql://192.168.200.126:3306/sonar?characterEncoding=utf8
</sonar.jdbc.url>
<sonar.jdbc.driver>com.mysql.jdbc.Driver</sonar.jdbc.driver>
<sonar.jdbc.username>sonar</sonar.jdbc.username>
<sonar.jdbc.password>sonar</sonar.jdbc.password>
<sonar.host.url>http://192.168.200.126:9000</sonar.host.url>
<!-- <sonar.jdbc.url>
jdbc:mysql://localhost:3306/sonar?characterEncoding=utf8
</sonar.jdbc.url>
<sonar.jdbc.driver>com.mysql.jdbc.Driver</sonar.jdbc.driver>
<sonar.jdbc.username>sonar</sonar.jdbc.username>
<sonar.jdbc.password>sonar</sonar.jdbc.password>
<sonar.host.url>http://localhost:9000</sonar.host.url> -->
</properties>
</profile>
Maven工程中pom.xml文件的修改
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>sonar-maven-plugin</artifactId>
<version>2.6</version>
</plugin>
这儿的版本号也很关键,不同的Sonar服务器对应不同的版本,我最开始用Sonar6.3做服务器,执行maven命令的时候不行,最后改成5.1.2后用这个2.6的版本才能启动成功。具体的对应关系还需要实际应用过程中再熟悉。
Maven命令把Maven工程的代码分析上传到Sonar服务器
mvn clean install 和 mvn sonar:sonar ,这两个命令可以分开执行,也可以连起来一起执行,即可以在eclipse工具中执行也可以在cmd命令行下执行。
只要保证前面各项配置正确,同时执行命令时Sonar服务器正常运行状态,执行后会把该Maven工程的代码检查结果上传到对应的mysql的sonar数据库中,这个时候刷新Sonar的web管理页面,就可以看到对应工程的情况了。(在我执行命令的过程中,在工程的根目录下面有.svn文件,会报错,不能检查.svn文件夹的文件,我目前也没找到怎么排除不需要检查的文件夹,采用的方式是先手动删除.svn文件夹后就可以正常生成对应的检查数据结果了)
到这一步后,就可以愉快的根据Sonar提示的各种信息,进行代码的优化和重构了,同时Sonar也提供了大量的插件来满足各种统计,比较、分析等方面,这方面后续补充!
安装过程中常见的错误和对应的处理
错误解决
错误1
WrapperSimpleApp: Unable to locate the class org.sonar.application.App:Java.lang.UnsupportedClassVersionError: org/sonar/application/App : Unsupported major.minor version 51.0
解决方法:
cd sonarqube-5.1.2/conf
vi wrapper.conf
linux:
wrapper.java.command=/opt/jdk1.7.0_80/bin/java
windows:
wrapper.java.command=C:\Documents and Settings\Administrator\MyEclipse Professional 2014\binary\com.sun.java.jdk7.win32.x86_1.7.0.u45\bin\java
参考:http://docs.sonarqube.org/display/SONAR/Requirements
错误2
Unsupported major.minor version 51.0
[ERROR] Failed to execute goal org.codehaus.mojo:sonar-maven-plugin:2.7:sonar (default-cli) on project zsale-web: Execution default-cli of goal org.codehaus.mojo:sonar-maven-plugin:2.7:sonar failed: Unable to load the mojo ‘sonar’ in the plugin ‘org.codehaus.mojo:sonar-maven-plugin:2.7’ due to an API incompatibility: org.codehaus.plexus.component.repository.exception.ComponentLookupException: org/codehaus/mojo/sonar/SonarMojo : Unsupported major.minor version 51.0
[ERROR] —————————————————–
[ERROR] realm = plugin>org.codehaus.mojo:sonar-maven-plugin:2.7
解决方法:
windows:
把path的jdk改为java7,并且重启cmd!(很重要),就可以了
linux:
vi .bash_profile
JAVA_HOME=/opt/jdk1.7.0_80
export JAVA_HOME
PATH= JAVAHOME/bin: PATH
export PATH
source $HOME/.bash_profile
错误3
[ERROR] Failed to execute goal org.codehaus.mojo:sonar-maven-plugin:2.7:sonar (default-cli) on project zsale-web: Fail to connect to database: Cannot load JDBC driver class ‘com.mysql.jdbc.Driver’ -> [Help 1]
解决方法:
把settings.xml里的mysql的配置去掉就成功了
或者:
vi sonar.properties
sonar.jdbc.username=sonar
sonar.jdbc.password=sonar
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance
改完要重启?
错误4
[ERROR] Failed to execute goal org.codehaus.mojo:sonar-maven-plugin:2.7.1:sonar(default-cli) on project zsale-web: Fail to connect to database: Cannot load JDBC driver class ‘org.h2.Driver’ -> [Help 1]
解决方法:
settings.xml里也得配置数据库
cd apache-maven-3.2.5/conf
vi settings.xml
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
pom.xml里的jdk可以为1.6
默认密码是admin/admin,保存在表users
错误5
Sonar与MySQL版本不匹配
这种情况下,可以在log里面看到类似如下这样的内容: 2016.05.18 15:17:37 INFO web[o.a.c.h.Http11NioProtocol] Starting ProtocolHandler ["http-nio-0.0.0.0-9000"] 2016.05.18 15:17:37 INFO web[o.s.s.a.TomcatAccessLog] Web server is started 2016.05.18 15:17:37 INFO web[o.s.s.a.EmbeddedTomcat] HTTP connector enabled on port 9000 2016.05.18 15:17:37 WARN web[o.s.p.ProcessEntryPoint] Fail to start web java.lang.IllegalStateException: Webapp did not start at org.sonar.server.app.EmbeddedTomcat.isUp(EmbeddedTomcat.java:84) ~[sonar-server-5.5.jar:na] at org.sonar.server.app.WebServer.isUp(WebServer.java:48) [sonar-server-5.5.jar:na] at org.sonar.process.ProcessEntryPoint.launch(ProcessEntryPoint.java:105) ~[sonar-process-5.5.jar:na] at org.sonar.server.app.WebServer.main(WebServer.java:69) [sonar-server-5.5.jar:na] 这里没有明显的错误,但是 Google之 才发现与版本有关,笔者一开始使用的SonarQube 5.6并不支持MySQL 5.5。所以需要将SonarQube降到5.4,当然也可以升级MySQL,笔者选择了前者。
错误6
虚拟机内存不够
2016.07.18 22:58:26 ERROR web[o.a.c.c.StandardContext] One or more listeners failed to start. Full details will be found in the appropriate container log file 2016.07.18 22:58:26 ERROR web[o.a.c.c.StandardContext] Context [] startup failed due to previous errors 2016.07.18 22:58:26 WARN web[o.a.c.l.WebappClassLoaderBase] The web application [ROOT] appears to have started a thread named [Abandoned connection cleanup thread] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread: java.lang.Object.wait(Native Method) java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143) com.mysql.jdbc.AbandonedConnectionCleanupThread.run(AbandonedConnectionCleanupThread.java:43) 2016.07.18 22:58:26 WARN web[o.a.c.l.WebappClassLoaderBase] The web application [ROOT] appears to have started a thread named [Timer-0] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread: java.lang.Object.wait(Native Method) java.util.TimerThread.mainLoop(Timer.java:552) java.util.TimerThread.run(Timer.java:505) 如果出现这样的log信息,那是因为SonarQube运行需要的内存不够的原因,缺啥补啥,笔者便将使用的虚拟机运存从512MB增加到1024MB,问题便消失了。
Windows下安装Sonar服务,跟随系统启动
D:\sonarqube-5.3\bin\windows-x86-64\InstallNTService.bat
启动服务需要配置登录账号密码,即操作系统的登录账号和密码(这里没有配置的话,服务是无法正常启动的)
Sonar插件
1.1、默认安装的插件
SonarQube默认集成了Java Ecosystem插件,该插件是一组插件的合集,包含如下的这些插件:
插件名
说明
sonar-java-plugin
java源代码解析,计算指标等
sonar-squid-java-plugin
检查潜在缺陷
sonar-checkstyle-plugin
检查代码编写风格
sonar-findbugs-plugin
检查潜在缺陷
sonar-pmd-plugin
检查潜在缺陷
sonar-surefire-plugin
执行单元测试
sonar-cobertura-plugin
统计代码覆盖率
sonar-jacoco-plugin
统计代码覆盖率
1.2、常用的插件
下面列出了一些常用的插件:
插件名
说明
sonar-javascript-plugin
JavaScript代码检查
sonar-python-plugin
Python代码检查
sonar-web-plugin
Web页面检查(HTML、JSP、JSF、Ruby、PHP等)
sonar-xml-plugin
XML文件检查
sonar-scm-stats-plugin
SCM源码库统计分析
sonar-metrics-plugin
文件度量
sonar-chinese-pack-plugin
中文语言包
sonar-timeline-plugin
时间表显示度量结果
sonar-motion-chart-plugin
度量结果演进图
1.3、安装插件
1.3.1、手动安装
SonarQube插件的下载地址为:http://docs.codehaus.org/display/SONAR/Plugin+Library
将下载后的插件放到${SONAR_HOME}/extensions/plugins目录下,重新启动SonarQube服务器。
1.3.2、通过Update Center安装
打开WEB页面,用户登陆后,进入“Settings”页面,点击左下角的“Update Center”,如下:
其中Available Plugins选项卡提供了可以选择安装的插件,System Updates可以在线更新SonarQube。
下载插件需要注意其中有些插件是需要购买才能使用的,其License类型为Commercial。
结束语
Sonar 为代码的质量管理提供了一个平台,对传统的代码静态检测如 PMD、FindBugs 等工具进行整合,可以说是目前最强大的代码质量管理工具之一。