4 与 checkstyle 合作
摘要: 介绍 checkstyle_checks.xml, java.header
现在已经有了目录结构, 有了 build_common.xml, common.xml, usage.txt,
build.xml, build.properties 等文件, 已经可以完成大部分任务了.
现在介绍如何进行辅助任务, 比如代码检查.
代码检查在 build_common.xml 中已经有这个任务了, 还需要到http://checkstyle.sf.net
下载 checkstyle 的 jar 包并将它放到 work/common/lib/ 目录下.
最后还需要两个配置文件配合.
这两个配置文件是 work/common/template/build/ 目录下的
checkstyle_checks.xml 文件和 java.header 文件.
checkstyle_checks.xml 文件说明了对 java 文件应该如何进行检查,
java.header 文件指出每个 java 文件的头部构造.
checkstyle_checks.xml 文件如下, 是借用Johan的源文件,
作了一点儿修改. 其中每项配置的具体说明都有给出链接, 不明白的话可以仔细看看.
<?xml version="1.0" encoding="iso-8859-1"?> <!- Copyright 2004 Johan K�ng�d, http://dev.kanngard.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -> <!DOCTYPE module PUBLIC "-//Puppy Crawl//DTD Check Configuration 1.2//EN" "http://www.puppycrawl.com/dtds/configuration_1_2.dtd"> <!- Based on the Checkstyle configuration file sun_checks.xml with some minor modifications.. Checkstyle is very configurable. Be sure to read the documentation at http://checkstyle.sf.net -> <module name="Checker"> <!- Checks that a package.html file exists for each package. -> <!- See http://checkstyle.sf.net/config_javadoc.html#PackageHtml -> <module name="PackageHtml"/> <!- Checks whether files end with a new line. -> <!- See http://checkstyle.sf.net/config_misc.html#NewlineAtEndOfFile -> <module name="NewlineAtEndOfFile"/> <!- Checks that property files contain the same keys. -> <!- See http://checkstyle.sf.net/config_misc.html#Translation -> <module name="Translation"/> <module name="TreeWalker"> <!- Checks for Javadoc comments. -> <!- See http://checkstyle.sf.net/config_javadoc.html -> <module name="JavadocMethod"/> <module name="JavadocType"/> <module name="JavadocVariable"/> <module name="JavadocStyle"/> <!- Checks for Naming Conventions. -> <!- See http://checkstyle.sf.net/config_naming.html -> <module name="ConstantName"/> <module name="LocalFinalVariableName"/> <module name="LocalVariableName"/> <module name="MemberName"> <property name="format" value="^[_A-Z][a-zA-Z0-9]*$"/> </module> <module name="MethodName"/> <module name="PackageName"/> <module name="ParameterName"/> <module name="StaticVariableName"/> <module name="TypeName"/> <!- Checks for Headers -> <!- See http://checkstyle.sf.net/config_header.html -> <module name="Header"> <!- The follow property value demonstrates the ability -> <!- to have access to ANT properties. In this case it uses -> <!- the ${basedir} property to allow Checkstyle to be run -> <!- from any directory within a project. See property -> <!- expansion, -> <!- http://checkstyle.sf.net/config.html#properties -> <property name="headerFile" value="${basedir}/build/java.header"/> <property name="ignoreLines" value="3,5,8"/> </module> <!- Following interprets the header file as regular expressions. -> <!- <module name="RegexpHeader"/> -> <!- Checks for imports -> <!- See http://checkstyle.sf.net/config_import.html -> <module name="AvoidStarImport"/> <module name="IllegalImport"/> <!- defaults to sun.* packages -> <module name="RedundantImport"/> <module name="UnusedImports"/> <!- Checks for Size Violations. -> <!- See http://checkstyle.sf.net/config_sizes.html -> <module name="FileLength"/> <module name="LineLength"/> <module name="MethodLength"/> <module name="ParameterNumber"/> <!- Checks for whitespace -> <!- See http://checkstyle.sf.net/config_whitespace.html -> <module name="EmptyForIteratorPad"/> <module name="MethodParamPad"/> <module name="NoWhitespaceAfter"/> <module name="NoWhitespaceBefore"/> <module name="OperatorWrap"/> <module name="ParenPad"/> <module name="TypecastParenPad"/> <!- <module name="TabCharacter"/>-> <module name="WhitespaceAfter"/> <module name="WhitespaceAround"/> <!- Modifier Checks -> <!- See http://checkstyle.sf.net/config_modifiers.html -> <module name="ModifierOrder"/> <module name="RedundantModifier"/> <!- Checks for blocks. You know, those 's -> <!- See http://checkstyle.sf.net/config_blocks.html -> <module name="AvoidNestedBlocks"/> <module name="EmptyBlock"/> <module name="LeftCurly"/> <module name="NeedBraces"/> <module name="RightCurly"/> <!- Checks for common coding problems -> <!- See http://checkstyle.sf.net/config_coding.html -> <module name="AvoidInlineConditionals"/> <module name="DoubleCheckedLocking"/> <!- MY FAVOURITE -> <module name="EmptyStatement"/> <module name="EqualsHashCode"/> <module name="HiddenField"> <property name="tokens" value="VARIABLE_DEF"/> </module> <module name="IllegalInstantiation"/> <module name="InnerAssignment"/> <module name="MagicNumber"/> <module name="MissingSwitchDefault"/> <module name="RedundantThrows"/> <module name="SimplifyBooleanExpression"/> <module name="SimplifyBooleanReturn"/> <!- Checks for class design -> <!- See http://checkstyle.sf.net/config_design.html -> <!- <module name="DesignForExtension"/> -> <module name="FinalClass"/> <module name="HideUtilityClassConstructor"/> <module name="InterfaceIsType"/> <module name="VisibilityModifier"/> <!- Miscellaneous other checks. -> <!- See http://checkstyle.sf.net/config_misc.html -> <module name="ArrayTypeStyle"/> <module name="FinalParameters"/> <module name="GenericIllegalRegexp"> <property name="format" value="/s+$"/> <property name="message" value="Line has trailing spaces."/> </module> <module name="TodoComment"/> <module name="UpperEll"/> </module> </module>
使用这个 checkstyle 时会有这么一个麻烦的地方: 它不允许在行尾有多余的空格.
对于程序员来说, 谁在乎这么几个空格呢, 可是程序就是这么死板:)
使用vim的朋友可以在这里发现如何轻松消除行尾空格.以下是我的 java 文件头部构造, 当然每个团队可以有自己的约定.
因为第3,5,8行是随文件的改变而改变的, 因此我忽略了对他们的检查,
这一点可以从上面的 checkstyle_checks.xml 文件中看出来.
/* * ----------------------------------------------------------- * file name : _filename_ * authors : wuh(wuh@vitular.com) * created : _datetime_ * copyright : (c) 2003 Vitular Inc. All Rights Reserved. * * modifications: * * ----------------------------------------------------------- */
有的朋友可能觉得每次都在文件前写这么一个头岂不是很麻烦, 但是对于我来说,
这一点非常容易就可以让 vim 做到了. 当我用 vim 新建一个 java 文件时,
它会自动加入这个头部说明, 并用适当的文件名和时间替换 _filename_ 和
_datetime_ 这两个参数. 这里说明了如何做到这一点.