Ant 用CheckStyle审查代码
?一个例子:
<?xml version="1.0" encoding="UTF-8"?><project name="junit" default="checkstyle"><property name="dir.src" location="src"/> <property name="dir.lib" location="WebContent/WEB-INF/lib"/> <property name="checkstyle.path" location="checkstyle"/> <property name="checkstyle.xml" location="${dir.src}/checkstyle_checks.xml"/> <property name="checkstyle.xsl" location="${dir.src}/checkstyle-frames.xsl"/> <path id="checkstyle.classpath"> <fileset dir="${dir.lib}"> <exclude name="junit-4.10.jar"/> <exclude name="commons-lang-2.4.jar"/> </fileset> </path> <target name="checkstyle-init"> <taskdef name="checkstyle" classname="com.puppycrawl.tools.checkstyle.CheckStyleTask" classpathref="checkstyle.classpath"/> <mkdir dir="${checkstyle.path}"/> <delete includeemptydirs="true"><fileset dir="${checkstyle.path}"><include name="**/*"/></fileset></delete> </target> <target name="checkstyle-run" depends="checkstyle-init"> <checkstyle failOnViolation="false" failureProperty="checkstyle.failed" config="${dir.src}/sun_checks.xml"> <fileset dir="${dir.src}" includes="**/*.java"/> <formatter type="plain"/> <formatter type="xml" toFile="${checkstyle.path}/checkstyle_report.xml"/> </checkstyle> </target> <target name="checkstyle-report" depends="checkstyle-run" if="checkstyle.failed"> <xslt style="${checkstyle.xsl}" in="${checkstyle.path}/checkstyle_report.xml" out="${checkstyle.path}/checkstyle_report.html"> </xslt> <fail> Checkstyle reported style failures.See ${checkstyle.path}/checkstyle_report.html </fail> </target> <target name="checkstyle" depends="checkstyle-report"/> </project>
?输出:
E:\workspace\Diary>ant -f build_checkstyle.xmlBuildfile: E:\workspace\Diary\build_checkstyle.xmlcheckstyle-init:checkstyle-run:[checkstyle] Running Checkstyle 5.6 on 2 files[checkstyle] E:\workspace\Diary\src\diary\core\entity\Diary.java:0: Missing package-info.java file.[checkstyle] E:\workspace\Diary\src\diary\core\entity\Diary.java:9: Missing a Javadoc comment.[checkstyle] E:\workspace\Diary\src\diary\core\entity\Diary.java:11:1: File contains tab characters (this is the first instance).[checkstyle] E:\workspace\Diary\src\diary\core\entity\Diary.java:11:9: Missing a Javadoc comment.[checkstyle] E:\workspace\Diary\src\diary\core\entity\Diary.java:13:9: Missing a Javadoc comment.[checkstyle] E:\workspace\Diary\src\diary\core\entity\Diary.java:14:9: Missing a Javadoc comment.[checkstyle] E:\workspace\Diary\src\diary\core\entity\Diary.java:15:9: Missing a Javadoc comment.[checkstyle] E:\workspace\Diary\src\diary\core\entity\Diary.java:16:9: Missing a Javadoc comment.[checkstyle] E:\workspace\Diary\src\diary\core\entity\Diary.java:18:9: Method 'getId' is not designed for extension - needs to be abstract, final or empty.[checkstyle] E:\workspace\Diary\src\diary\core\entity\Diary.java:18:9: Missing a Javadoc comment.[checkstyle] E:\workspace\Diary\src\diary\core\entity\Diary.java:22:9: Method 'setId' is not designed for extension - needs to be abstract, final or empty.[checkstyle] E:\workspace\Diary\src\diary\core\entity\Diary.java:22:9: Missing a Javadoc comment.[checkstyle] E:\workspace\Diary\src\diary\core\entity\Diary.java:22:27: Parameter id should be final.[checkstyle] E:\workspace\Diary\src\diary\core\entity\Diary.java:22:34: 'id' hides a field.[checkstyle] E:\workspace\Diary\src\diary\core\entity\Diary.java:26:9: Method 'getName' is not designed for extension - needs to be abstract, final or empty.[checkstyle] E:\workspace\Diary\src\diary\core\entity\Diary.java:26:9: Missing a Javadoc comment.[checkstyle] E:\workspace\Diary\src\diary\core\entity\Diary.java:30:9: Method 'setName' is not designed for extension - needs to be abstract, final or empty.[checkstyle] E:\workspace\Diary\src\diary\core\entity\Diary.java:30:9: Missing a Javadoc comment.[checkstyle] E:\workspace\Diary\src\diary\core\entity\Diary.java:30:29: Parameter name should be final.[checkstyle] E:\workspace\Diary\src\diary\core\entity\Diary.java:30:36: 'name' hides a field.[checkstyle] E:\workspace\Diary\src\diary\core\entity\Diary.java:34:9: Method 'getCreateTime' is not designed for extension - needs to be abstract, final or empty.[checkstyle] E:\workspace\Diary\src\diary\core\entity\Diary.java:34:9: Missing a Javadoc comment.[checkstyle] E:\workspace\Diary\src\diary\core\entity\Diary.java:38:9: Method 'setCreateTime' is not designed for extension - needs to be abstract, final or empty.[checkstyle] E:\workspace\Diary\src\diary\core\entity\Diary.java:38:9: Missing a Javadoc comment.[checkstyle] E:\workspace\Diary\src\diary\core\entity\Diary.java:38:35: Parameter createTime should be final.[checkstyle] E:\workspace\Diary\src\diary\core\entity\Diary.java:38:40: 'createTime' hides a field.[checkstyle] E:\workspace\Diary\src\diary\core\entity\Diary.java:42:9: Method 'getContent' is not designed for extension - needs to be abstract, final or empty.[checkstyle] E:\workspace\Diary\src\diary\core\entity\Diary.java:42:9: Missing a Javadoc comment.[checkstyle] E:\workspace\Diary\src\diary\core\entity\Diary.java:46:9: Method 'setContent' is not designed for extension - needs to be abstract, final or empty.[checkstyle] E:\workspace\Diary\src\diary\core\entity\Diary.java:46:9: Missing a Javadoc comment.[checkstyle] E:\workspace\Diary\src\diary\core\entity\Diary.java:46:32: Parameter content should be final.[checkstyle] E:\workspace\Diary\src\diary\core\entity\Diary.java:46:39: 'content' hides a field.[checkstyle] E:\workspace\Diary\src\diary\core\entity\Diary.java:50:9: Method 'toString' is not designed for extension - needs to be abstract, final or empty.[checkstyle] E:\workspace\Diary\src\diary\core\entity\Diary.java:52: Line is longer than 80 characters (found 145).[checkstyle] E:\workspace\Diary\src\diary\core\service\DiaryService.java:0: Missing package-info.java file.[checkstyle] E:\workspace\Diary\src\diary\core\service\DiaryService.java:7: Missing a Javadoc comment.[checkstyle] E:\workspace\Diary\src\diary\core\service\DiaryService.java:9:1: File contains tab characters (this is the first instance).[checkstyle] E:\workspace\Diary\src\diary\core\service\DiaryService.java:9:9: Method 'list' is not designed for extension - needs to be abstract, final or empty.[checkstyle] E:\workspace\Diary\src\diary\core\service\DiaryService.java:9:9: Missing a Javadoc comment.[checkstyle] E:\workspace\Diary\src\diary\core\service\DiaryService.java:13:9: Method 'get' is not designed for extension - needs to be abstract, final or empty.[checkstyle] E:\workspace\Diary\src\diary\core\service\DiaryService.java:13:9: Missing a Javadoc comment.[checkstyle] E:\workspace\Diary\src\diary\core\service\DiaryService.java:13:26:Parameter name should be final.[checkstyle] E:\workspace\Diary\src\diary\core\service\DiaryService.java:17:9: Method 'save' is not designed for extension - needs to be abstract, final or empty.[checkstyle] E:\workspace\Diary\src\diary\core\service\DiaryService.java:17:9: Missing a Javadoc comment.[checkstyle] E:\workspace\Diary\src\diary\core\service\DiaryService.java:17:25:Parameter diary should be final.[checkstyle] E:\workspace\Diary\src\diary\core\service\DiaryService.java:21:9: Method 'update' is not designed for extension - needs to be abstract, final or empty.[checkstyle] E:\workspace\Diary\src\diary\core\service\DiaryService.java:21:9: Missing a Javadoc comment.[checkstyle] E:\workspace\Diary\src\diary\core\service\DiaryService.java:21:27:Parameter diary should be final.[checkstyle] E:\workspace\Diary\src\diary\core\service\DiaryService.java:25:9: Method 'delete' is not designed for extension - needs to be abstract, final or empty.[checkstyle] E:\workspace\Diary\src\diary\core\service\DiaryService.java:25:9: Missing a Javadoc comment.[checkstyle] E:\workspace\Diary\src\diary\core\service\DiaryService.java:25:27:Parameter id should be final.[checkstyle] E:\workspace\Diary\src\diary\core\service\DiaryService.java:29:9: Method 'delete' is not designed for extension - needs to be abstract, final or empty.[checkstyle] E:\workspace\Diary\src\diary\core\service\DiaryService.java:29:9: Missing a Javadoc comment.[checkstyle] E:\workspace\Diary\src\diary\core\service\DiaryService.java:29:27:Parameter diary should be final.checkstyle-report: [xslt] Processing E:\workspace\Diary\checkstyle\checkstyle_report.xml to E:\workspace\Diary\checkstyle\checkstyle_report.html [xslt] Loading stylesheet E:\workspace\Diary\src\checkstyle-frames.xslBUILD FAILEDE:\workspace\Diary\build_checkstyle.xml:43: Checkstyle reported style failures.See E:\workspace\Diary\checkstyle/checkstyle_report.htmlTotal time: 1 second
?
? ??测试中用到的项目在附件中,里面包含了运行后的输出内容,项目很简单。
?
Checkstyle官网关于如何在Ant中使用Checkstyle
?
This task runs Checkstyle over specified Java files. The task has been tested using ANT 1.5. The latest version of checkstyle can be found athttp://checkstyle.sourceforge.net/. This task is included in the checkstyle distribution.
The easiest way is to include?checkstyle-5.6-all.jar?in the classpath. This contains all the classes required to run Checkstyle. Alternatively, you must include the?compile?third party dependencies listed in?Project Dependencies?in the classpath.
To use the task in a build file, you will need the following?taskdef?declaration:
<taskdef resource="checkstyletask.properties" classpath="/path/to/checkstyle-5.6-all.jar"/>
Or, assuming that Checkstyle is in the global classpath (not recommended), then you will need the following?taskdef?declaration:
<taskdef resource="checkstyletask.properties"/>
Or if you use Ant 1.6 and later and assuming that Checkstyle is in the library search path, then you may use antlib feature of Ant (seehttp://ant.apache.org/manual/Types/antlib.html?for more details). For example:
<project name="foo" ... xmlns:cs="antlib:com.puppycrawl.tools.checkstyle">... <cs:checkstyle> ... </cs:checkstyle>...</project>
Note that the?packageNamesFile?parameter has been dropped for Checkstyle 5.0, because of significant changes regarding package name file handling. Seefor details.
This task supports the nested elements?<fileset>,?<classpath>,?<formatter>, and?<property>.
The parameters for the?<formatter>?element are:
AttributeDescriptionRequiredtypeThe type of output to generate. The valid values are:
plain?- specifies the?DefaultLoggerxml?- specifies the?XMLLoggerDefaults to?"plain".
NotoFileThe file to write output to. Defaults to standard output. Note, there is no way to explicitly specify standard output.NouseFileBoolean that determines whether output should be sent to a file. Default is?true.NoA?<property>?element provides a property for?expanded property values?of the configuration. The parameters for the?<property>?element are:
AttributeDescriptionRequiredkeyThe key for the property.
YesvalueThe value of the property specified as a string.Either?value?or?filefileThe value of the property specified as a file. This is great for specifying file names relative to the ANT build file.Either?value?or?fileRun checkstyle with configuration file?docs/sun_checks.xml?on a single file
<checkstyle config="docs/sun_checks.xml" file="Check.java"/>
Run checkstyle on a set of Java files using site-wide configuration and an expanded property value
<checkstyle config="/path/to/site/sun_checks.xml"> <fileset dir="src/checkstyle" includes="**/*.java"/> <!-- Location of cache-file. Something that is project specific --> <property key="checkstyle.cache.file" file="target/cachefile"/></checkstyle>
Run checkstyle on a set of files and output messages to standard output in plain format, and a file in XML format
<checkstyle config="docs/sun_checks.xml"> <fileset dir="src/checkstyle" includes="**/*.java"/> <formatter type="plain"/> <formatter type="xml" toFile="build/checkstyle_errors.xml"/></checkstyle>
Run checkstyle with configuration file?docs/sun_checks.xml?on a file and provide a package names file
<checkstyle config="docs/sun_checks.xml" packageNamesFile="myPackageNames.xml" file="Check.java"/>
Run checkstyle in an automated build and send an email report if style violations are detected
<target name="checkstyle" description="Generates a report of code convention violations."> <checkstyle config="docs/sun_checks.xml" failureProperty="checkstyle.failure" failOnViolation="false"> <formatter type="xml" tofile="checkstyle_report.xml"/> <fileset dir="src" includes="**/*.java"/> </checkstyle> <style in="checkstyle_report.xml" out="checkstyle_report.html" style="checkstyle.xsl"/></target><!-- run this target as part of automated build --><target name="checkstyle-nightly" depends="checkstyle" if="checkstyle.failure" description="Sends email if checkstyle detected code conventions violations."> <!-- use your own server and email addresses below. See Ant documentation for details --> <mail from="qa@some.domain" tolist="someone@some.domain,someoneelse@some.domain" mailhost="mailbox.some.domain" subject="Checkstyle violation(s) in project ${ant.project.name}" files="checkstyle_report.html"/></target>??