﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-justuszhang2009-随笔分类-持续集成</title><link>http://www.blogjava.net/justuszhang2009/category/48842.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 24 Jun 2011 22:00:01 GMT</lastBuildDate><pubDate>Fri, 24 Jun 2011 22:00:01 GMT</pubDate><ttl>60</ttl><item><title>【转】持续集成工具</title><link>http://www.blogjava.net/justuszhang2009/archive/2011/06/24/352182.html</link><dc:creator>张益刚</dc:creator><author>张益刚</author><pubDate>Fri, 24 Jun 2011 05:06:00 GMT</pubDate><guid>http://www.blogjava.net/justuszhang2009/archive/2011/06/24/352182.html</guid><wfw:comment>http://www.blogjava.net/justuszhang2009/comments/352182.html</wfw:comment><comments>http://www.blogjava.net/justuszhang2009/archive/2011/06/24/352182.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/justuszhang2009/comments/commentRss/352182.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/justuszhang2009/services/trackbacks/352182.html</trackback:ping><description><![CDATA[<table class="seyle4" border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td class="content9" valign="middle"><strong></strong></td></tr>
<tr>
<td>
<div align="right"><span class="textbox-label">[ 2009-12-23 9:25:00 | By: <span class="style3">王海鹏</span> ]</span></div></td></tr></tbody></table>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td height="3">&nbsp;</td></tr></tbody></table>
<table style="table-layout: fixed" border="0" cellspacing="0" cellpadding="0" width="100%" align="center">
<tbody>
<tr>
<td><span class="oblog_text"><span id="ob_logd41613">
<div style="text-align: center; margin: 0px 10px 5px 0px; width: 45px; display: inline;background: url(http://www.blogjava.net/Images/digg.gif) no-repeat left top; float: right; height: 55px" class="digg_list">
<div style="padding-bottom: 11px; line-height: 1; padding-left: 0px; width: 45px; padding-right: 0px; font-family: tahoma,Arial,Helvetica,sans-serif; color: #333; font-size: 18px; font-weight: 600; padding-top: 10px" class="digg_number">0</div>
<div style="padding-bottom: 0px; line-height: 1; padding-left: 6px; padding-right: 0px; letter-spacing: 6px; padding-top: 3px" class="digg_submit"><a style="line-height: 1; font-size: 12px" href="javascript:void(null)">推荐</a></div></div></span>
<p>引言</p>
<p>Thomas Carlyle说：&#8220;人类是使用工具的动物。没有工具，人什么都不是；有了工具，人无所不能。&#8221;金融家们创造了复杂的金融工具，并利用这些工具制造了财富神话，制造了著名的跨国公司，也制造了世界范围的危机。软件精英们为了让自己的工作效率更高，有更多时间去做想做的事，也创造了各式各样的工具。持续集成已经不是一个新概念，在这个概念发展的十多年间，出现了支持这一概念的众多工具。这些工具的组合使用，为软件开发提供了强大的支持。</p>
<p>持续集成工具的分类和功能</p>
<p>一般来说，持续集成工具可以分成两大类：自动化构建工具和构建计划安排工具。</p>
<p>自动化构建工具有这样一些基本功能：代码编译、组件打包、程序执行和文件操作。编译源代码是构建的主要工作之一，为了提高效率，编译应该根据相应的源代码是否发生改变而有条件地执行。组件打包是将编译的结果和其他需要包含的文件组织在一起，形成可以部署的组件。构建工具应该知道何时需要重新打包。程序执行是指构建工具能够在它支持的平台上，调用所有提供命令行接口的程序。构建工具应该支持创建、拷贝、删除文件和目录等操作。</p>
<p>某些自动化构建工具还有一些扩展功能：执行开发者测试、版本控制工具集成、文档集成、部署功能、代码品质分析、支持扩展、多平台构建、加速构建。虽然构建工具可以通过命令行执行的方式来集成构建工具和测试工具，但如果它提供更直接的集成方式，开发者就更省力。同样，如果构建工具能够直接与版本控制工具集成，开发者也会觉得更方便。文档集成是指构建工具能够自动从源代码中抽取并生成API文档。构建工具还可以将打包好的组件自动部署到目标测试环境中去。构建工具一般通过一些第三方插件，支持对代码品质进行分析。而提供插件接口，是构建工具实现可扩展性的通用方式。如果您开发的软件需要在多个平台上构建并测试，那么构建工具对多平台的支持就会带来极大的方便。对于较大的代码集，一次构建可能需要好几个小时，这为持续集成带来了一些挑战。有的构建工具支持加速构建，即在多个构建服务器的多个处理器上进行分布式构建。</p>
<p>常见的自动化构建工具包括Ant、NAnt、MSBuild、make、Maven、Rake等。</p>
<p>构建计划安排工具有这样一些基本功能：构建执行、版本控制集成、构建工具集成、提供反馈、为构建打上标签。构建计划安排工具的核心功能就是在特定时间执行自动化的构建，这可以通过轮询版本控制库、计划驱动或事件通知等方式来实现。大部分构建计划安排工具都支持大多数流行的版本控制系统，也支持大多数流行的构建工具。构建计划安排工具至少支持通过电子邮件提供反馈信息，有一些工具可以通过即时消息、手机短信或其他设备来提供反馈。大多数构建计划安排工具会提供某种类型的升序计数，作为构建版本的标签。</p>
<p>某些构建计划安排工具还有一些扩展功能：支持项目间依赖关系、提供用户界面、制品发布、安全。如果项目间存在依赖关系，您可能希望在被依赖的项目重新构建时，重新构建依赖于它的项目。设计良好的用户界面会在工作时为您节约时间。制品发布是指除了得到可部署的组件之外，一些成熟的某些构建计划安排工具可以将文档、测试结果、品质分析结构和其他测量指标数据格式化，便于查看。有一些工具提供了身份认证和授权等安全方面的功能，允许您指定谁能查看结果和修改配置。</p>
<p>常见的构建计划安排工具包括AnthillPro、Continuum、CruiseControl、CruiseControl.NET、Draco.NET、Luntbuild、Hudson等。</p>
<p>下面介绍两个颇具代表性的工具：Ant和Hudson。</p>
<p>Ant</p>
<p>Ant是Java构建工具的事实标准，一般建议，不论项目团队成员使用哪种集成开发环境，项目都要有一个可以脱离IDE执行的Ant脚本。Ant采用插件式的设计结构，通过不同的插件来实现各种任务，其任务分类如表1所示。</p>
<p>Archive Tasks<br />&nbsp;打包解包任务，支持的格式包括：BZip2、Cab、Ear、GZip、Jar、Rpm、Tar、War、Zip。<br />&nbsp;<br />Audit/Coverage Tasks<br />&nbsp;JDepend任务，调用JDepend实现代码静态分析，针对每个Java包生成设计品质指标数据。<br />&nbsp;<br />Compile Tasks<br />&nbsp;编译任务，实现对Java、JSP、NetRexx等源文件的编译。<br />&nbsp;<br />Deployment Tasks<br />&nbsp;部署任务，实现在JavaEE服务器上热部署。<br />&nbsp;<br />Documentation Tasks<br />&nbsp;文档生成任务，生成javadoc文档、Apache Stylebook文档。<br />&nbsp;<br />EJB Tasks<br />&nbsp;EJB任务，提供对1.x和2.x的EJB的支持，并支持不同供应商的应用服务器。<br />&nbsp;<br />Execution Tasks<br />&nbsp;执行任务，包括对子项目调用Ant、调用同一脚本中的另一个target、执行系统提供的命令行程序、执行Java程序、暂停和并行同步执行等功能。<br />&nbsp;<br />File Tasks<br />&nbsp;文件任务，实现对文件和目录的操作。<br />&nbsp;<br />Java2 Extensions Tasks<br />&nbsp;Java2 扩展信息任务，对jar包中的版本、供应商等扩展信息进行检查和操作。<br />&nbsp;<br />Logging Tasks<br />&nbsp;日志任务，将构建过程事件记录到文件中。<br />&nbsp;<br />Mail Tasks<br />&nbsp;邮件任务，发送SMTP邮件。<br />&nbsp;<br />Miscellaneous Tasks<br />&nbsp;其他任务，各种或许会用到的小任务，例如播放wav文件。<br />&nbsp;<br />.NET Tasks<br />&nbsp;.NET任务，支持执行.NET程序、执行NUnit测试、调用NAnt、调用MSBuild、调用WiX工具。<br />&nbsp;<br />Pre-process Tasks<br />&nbsp;预处理任务，实现编译之前的一些预处理。例如调用ANTLR、JavaCC、Native2Ascii等程序。<br />&nbsp;<br />Property Tasks<br />&nbsp;属性任务，对脚本中的属性变量进行判断和操作。<br />&nbsp;<br />Remote Tasks<br />&nbsp;远程任务，支持FTP、Rexec、Scp、SSH和Telnet。<br />&nbsp;<br />SCM Tasks<br />&nbsp;SCM任务，支持各种配置管理（版本控制）软件，包括CVS、ClearCase、Continuus、Visual SourceSafe、Perforce、PVCS、SourceOffSite和StarTeam。<br />&nbsp;<br />Testing Tasks<br />&nbsp;测试任务，支持执行JUnit测试。<br />&nbsp;<br />表1. Ant任务分类</p>
<p>以上介绍的只是Ant发行版所带的一些任务。由于Ant采用的是插件结构，所以开发者可以开发自己需要的Ant任务，支持各种工具，如FindBugs、TestNG等其他代码检查工具和测试工具。早期的Ant没有很好的依赖关系支持，后来则通过Ivy弥补了这一缺点。</p>
<p>关键是Ant为我们提供了一个跨平台的Java构建工具，为持续集成提供了根本的支持。对于Java开发者来说，如果不想采用Ant，也可以考虑采用Maven。</p>
<p>Hudson</p>
<p>Hudson是一个开放源代码的CI服务器，受到世界各地各种规模和类型的开发团队的欢迎。关键是因为它非常易于安装和使用，提供了灵活的配置方式和复杂的功能，同时支持Java项目和非Java项目，由强大的Hudson社区提供技术支持。</p>
<p>简而言之，Hudson不仅仅是一个CI服务器，它的可扩展架构使它不仅是一个构建管理系统，也成为一个通用的开发生命周期管理系统，让开发者能够完成提升基线、打标签、执行工作流、根据依赖关系追踪变更、监视并图示测试结果、查看代码覆盖率和违反编码标准的情况等任务。</p>
<p>Hudson是最活跃，成长最快的开源社区之一，目前每周下载达4000次，有超过2万个在工作的安装实例。它的开发者超过160人，贡献的工作量超过137人年，目前已发布了超过300个发行版本。Hudson实际上是现在世界上最受欢迎的开源CI服务器。</p>
<p>图1是Apache软件基金会运行Hudson的屏幕截图，您可以在<a href="http://wiki.hudson-ci.org/display/HUDSON/Meet+Hudson">http://wiki.hudson-ci.org/display/HUDSON/Meet+Hudson</a> 看到更多Hudson的使用案例。</p>
<p>图1. Apache运行的Hudson</p>
<p>Huddon的主要优点包括：</p>
<p>易于安装。只要执行&#8220;java &#8211;jar hudson.war&#8221;，或者将hudson.war部署到应用服务器上就可以了，不需要其他的安装工作，也不需要建立数据库。 <br />易于配置。所有东西都通过Web GUI界面来配置，不需要手工修改XML文件。 <br />支持分布式构建。Hudson支持将构建和测试负载分布到多台机器上，图2是Apache采用Hudson的分布式构建功能。 <br />支持环境配置矩阵。Hudson支持在不同的环境配置下执行相同的任务，例如不同的JDK版本、不同的操作系统、不同的数据库。执行的结果可以汇总在一起。 <br />支持JUnit/TestNG测试报告。测试的结果可以分标签列出、汇总，并与历史信息一同显示。历史趋势可以显示在图中。 <br />追踪依赖关系。Hudson追踪记录哪次构建生成了哪些jar，某次构建使用了哪些版本的jar，即使这些jar包来自于外部也可以。 </p>
<p>图2. Hudson支持的分布式构建</p>
<p>Hudson通过大量的插件来实现其丰富的功能，这些插件大致可以分为以下几类：</p>
<p>SCM。Hudson缺省支持CVS和Subversion，通过安装插件支持Accurev、Bitkeeper、ClearCase、Git、Mercurial、Perforce、StarTeam、Synergy等 <br />构建触发器。可以通过IRC、Ivy、Jabber、Join、Locks and Latches、Navigator来触发执行构建。 <br />构建工具。缺省支持Ant、Maven、shell s和Windows 批处理命令，通过安装插件支持batch tasks、Gant、Gradle、Grails、Groovy、Jython、Kundo、MSBuild、Phing、Powershell、Python、Rake、Ruby、SCons、SCTMExecutor,Selenium等。 <br />构建包装。对构建的方式进行一些控制，如并发同步、启停虚拟机等。包括Hudson Centralized Job Action、Hudson Distributed Workspace Clean、Locks and Latches、M2 Extra Steps、M2 Release、Release、VMware、Xvnc、Zen Timestamp等。 <br />构建通知。缺省支持电子邮件通知，通过插件支持Campfire、Google Calendar、HudsonTracker (RSS feeds)、IRC、Jabber、Nabaztag、SameTime、Status Monitor、The new Emailer、TuxDroid、Twitter等。 <br />Slave启动和控制。缺省支持JNLP和命令行，通过插件支持SSH。 <br />构建报告。缺省支持JUnit、javadoc和FindBugs，通过插件支持CCCC、Checkstyle、Clover、DRY、Emma、Gallio、Gnat、Grinder、Japaex、JavaNCS、JavaTest Report、MSTest、N Cover、NUint、Plot、PMD、PureCoverage、Ruby metrics、Selenium AES、Selenium hq、Serenitec、SLOCCount、Task Scanner、Testability Explorer、Violations、Warnings、WebTest Presenter等。图3是Sonar生成的项目报告的样例。 <br />集群管理/分布式构建。支持DistFork、Hadoop、PXE、Selenium、Swarm等。 <br />制品上传。支持FTP-Publisher、java.net uploader、SCP,SFEE、SVN等。 <br />身份认证和用户管理。支持操作审计追踪、LDAP、MySQL认证等。 </p>
<p>图3. Sonar Dashboard</p>
<p>结束语</p>
<p>工欲善其事，必先利其器。人是工具的主宰。A fool with a tool is still a fool（傻子拿着工具还是傻子）。人们总是在学习工具、使用工具、创造更好的工具，以期提高工作的效率和品质。人要有智慧，工具要先进。<br /></p></span></td></tr></tbody></table>  <img src ="http://www.blogjava.net/justuszhang2009/aggbug/352182.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/justuszhang2009/" target="_blank">张益刚</a> 2011-06-24 13:06 <a href="http://www.blogjava.net/justuszhang2009/archive/2011/06/24/352182.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>持续集成工具Sonar的使用（二）</title><link>http://www.blogjava.net/justuszhang2009/archive/2011/06/14/352280.html</link><dc:creator>张益刚</dc:creator><author>张益刚</author><pubDate>Tue, 14 Jun 2011 09:02:00 GMT</pubDate><guid>http://www.blogjava.net/justuszhang2009/archive/2011/06/14/352280.html</guid><wfw:comment>http://www.blogjava.net/justuszhang2009/comments/352280.html</wfw:comment><comments>http://www.blogjava.net/justuszhang2009/archive/2011/06/14/352280.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/justuszhang2009/comments/commentRss/352280.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/justuszhang2009/services/trackbacks/352280.html</trackback:ping><description><![CDATA[上一篇我们讲述了Sonar和Maven的结合来达到代码质量审查的效果，但是由于maven的学习成本高，并不是任何项目都适合，因此本篇我们讲述一下如何通过Sonar和ant的结合来进行代码质量审查。<br />&nbsp;<br />目前来说，Sonar和Ant的集成没有做到Sonar和Maven的集成这么好，因此在使用过程中需要多写一些脚本。我们下面来介绍一下使用步骤吧：<br />&nbsp; 1、下载Sonar并解压到任何目录，注意目录中不允许有中文；<br />&nbsp; 2、点击bin\windows-x86-32\StartSonar.bat启动Sonar；<br />&nbsp; 3、下载一个ant插件：sonar-ant-task-1.1.jar，并存放到某个路径，ant脚本需要访问这个文件。<br />&nbsp; 4、编写一个ant脚本，如下：<br />
<p>&lt;?xml version="1.0" encoding="UTF-8" ?&gt;</p>
<p>&lt;project name="framework-client" default="sonar" basedir="."&gt;<br />&nbsp;&nbsp;<br />&nbsp;&lt;property name="project.name" value="framework-client"/&gt;<br />&nbsp;&lt;property name="src.dir" value="${basedir}/src/main/java" /&gt;<br />&nbsp;&lt;property name="lib.dir" value="${basedir}/lib"/&gt;<br />&nbsp;<br />&nbsp;&nbsp; &lt;!-- Out-of-the-box those parameters are optional --&gt;<br />&nbsp;&nbsp; &lt;!-- EXAMPLE FOR MYSQL&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; &lt;property name="sonar.jdbc.url" <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value="jdbc:mysql://localhost:3306/sonar?useUnicode=true&amp;amp;characterEncoding=utf8" /&gt;<br />&nbsp;&nbsp; &lt;property name="sonar.jdbc.driverClassName" value="com.mysql.jdbc.Driver" /&gt;<br />&nbsp;&nbsp; &lt;property name="sonar.jdbc.username" value="sonar" /&gt;<br />&nbsp;&nbsp; &lt;property name="sonar.jdbc.password" value="sonar" /&gt;<br />&nbsp;&nbsp; --&gt;<br /><br />&nbsp;&nbsp; &lt;!-- SERVER ON A REMOTE HOST --&gt;<br />&nbsp;&nbsp; &lt;!--<br />&nbsp;&nbsp; &lt;property key="sonar.host.url" value="<a href="http://myserver:1234">http://myserver:1234</a>" /&gt;<br />&nbsp;&nbsp; --&gt;<br />&nbsp;<br />&nbsp;&nbsp; &lt;!-- Define the Sonar task if this hasn't been done in a common script --&gt;<br />&nbsp;&nbsp; &lt;taskdef uri="antlib:org.sonar.ant" resource="org/sonar/ant/antlib.xml"&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&lt;classpath&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&lt;pathelement location="<span style="background-color: yellow">${lib.dir}/sonar-ant-task-1.1.jar</span>"/&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&lt;/classpath&gt;<br />&nbsp;&nbsp; &lt;/taskdef&gt;<br />&nbsp;&nbsp; <br />&nbsp;&nbsp; &lt;!-- Add the target --&gt;<br />&nbsp;&nbsp; &lt;target name="sonar"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- list of mandatories Sonar properties --&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="sonar.sources" value="${src.dir}" /&gt;<br />&nbsp;&nbsp; &nbsp;&lt;property name="sonar.projectKey" value="org.example:${project.name}" /&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- list of optional Sonar properties --&gt;<br />&nbsp;&nbsp; &nbsp;&lt;!--<br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;property key="sonar.projectName" value="this value overrides the name defined in Ant root node" /&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;property key="sonar.binaries" value="list of directories which contain for example the Java bytecode" /&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;property key="sonar.tests" value="list of test source directories separated by a comma" /&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;property key="sonar.libraries" value="list of paths to libraries separated by a comma (These libraries are for example used by the Sonar Findbugs plugin)" /&gt;<br />&nbsp;&nbsp; &nbsp;--&gt;<br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;sonar:sonar key="${sonar.projectKey}" version="0.9" xmlns:sonar="antlib:org.sonar.ant"/&gt;</p>
<p>&nbsp;&nbsp; &nbsp;&lt;/target&gt;<br />&lt;/project&gt;<br /><br />&nbsp; 5、运行ant脚本，看到build successfully的提示后，就可以访问：<a href="http://localhost:9000/">http://localhost:9000/</a>来查看代码质量审查结果了。<br /><br />上述是使用Sonar和ant最简单的步骤，用了Sonar自带的嵌入式数据库Derby，以及standalone的应用服务器，当然也支持使用其它数据库，比如：mysql，只要修改一下sonar.properties的配置文件，以及在ant脚本中配置一下连接数据库的方式。另外也可以使用tomcat、jboss等应用服务器来发布Sonar应用，只要运行一下Sonar自带的一个脚本：build-war.bat就可以了，这里不再详述。<br /></p>  <img src ="http://www.blogjava.net/justuszhang2009/aggbug/352280.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/justuszhang2009/" target="_blank">张益刚</a> 2011-06-14 17:02 <a href="http://www.blogjava.net/justuszhang2009/archive/2011/06/14/352280.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>持续集成工具Sonar的使用（一）</title><link>http://www.blogjava.net/justuszhang2009/archive/2011/06/13/352176.html</link><dc:creator>张益刚</dc:creator><author>张益刚</author><pubDate>Mon, 13 Jun 2011 03:42:00 GMT</pubDate><guid>http://www.blogjava.net/justuszhang2009/archive/2011/06/13/352176.html</guid><wfw:comment>http://www.blogjava.net/justuszhang2009/comments/352176.html</wfw:comment><comments>http://www.blogjava.net/justuszhang2009/archive/2011/06/13/352176.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/justuszhang2009/comments/commentRss/352176.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/justuszhang2009/services/trackbacks/352176.html</trackback:ping><description><![CDATA[最近由于工作需要，接触到了Sonar，使用它的出发点是因为它能统计代码注释率，而且支持drill down，可以依次看到工程、包、类的注释率。<br /><br />但Sonar作为一个很不错的持续集成工具，它的功能源不止于此，<span lang="EN-US"><strong>sonar</strong></span>&nbsp;可以持续，自动地统计并分析软件项目的相关质量数据，例如单元测试的通过率，覆盖率，代码的复杂度，代码的行数，代码注释率等等，用于评估和度量软件项目质量。<br /><br />我的Sonar的第一个应用，是Sonar和maven的配合使用，Sonar对Maven支持的比较好，网站上对于这两者结合使用的文章也非常多，因此如何用Sonar和maven来分析项目质量，在这边就不细说了，可以参考官方的网站：<a href="http://docs.codehaus.org/display/SONAR/Use+Sonar">http://docs.codehaus.org/display/SONAR/Use+Sonar</a>。这边主要说一下大致的步骤，以及在具体使用中碰到的几个问题。Sonar的使用真的非常简单，大概就包括以下几步，<br /><br />&nbsp;1、到官方网站下载<span lang="EN-US">Sonar</span>&nbsp;的压缩包，解压到任意目录，但是一定要注意：<strong style="color: red">目录中不允许有中文</strong>，不然启动Sonar后，访问：<a href="http://localhost:9000">http://localhost:9000</a>返回的界面会报错。<br />&nbsp;2、启动Sonar应用，可以直接点击bin/windows-x86-32目录下的StartSonar.bat，启动过程可能要1分多钟，请耐心等待，这里Sonar有一点不好的是，弹出的console中不打印任何信息。<br />&nbsp;3、进入你的工程目录（当前目录下面有pom.xml文件），运行：mvn clean install&nbsp; sonar:sonar，看到build successfully之后，就可以访问：<a href="http://localhost:9000/">http://localhost:9000</a>来分析你的工程的代码质量了。<br /><br />这里要说明的是，在执行maven命令时，后台会报一些乱码方面的错误，是由于java代码中出现中文字符串的问题造成的。可以通过以下方式解决：在&lt;properties&gt;中添加<strong>：&lt;project.build.sourceEncoding&gt;UTF-8&lt;/project.build.sourceEncoding&gt;</strong>，这是我试过的唯一的解决方案，在网上还提到两种解决方案，但都不管用。  <img src ="http://www.blogjava.net/justuszhang2009/aggbug/352176.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/justuszhang2009/" target="_blank">张益刚</a> 2011-06-13 11:42 <a href="http://www.blogjava.net/justuszhang2009/archive/2011/06/13/352176.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>