Jenkins+PMD构建自动化静态代码检测

jopen 9年前

前言:软件缺陷是不可避免的,要尽量减少错误并提高软件质量,主要有两在类技术,即缺陷预防和缺陷检测

缺陷预防包括编写更好的设计规范、实施代码审核制度、运行代码静态分析工具、运行单元测试等

PMD是一种开源分析Java代码的工具,通过静态分析获知代码错误,该工具可以做到检查Java代码中是否含有未使用的变量、是否含有空的抓取块、是否含有不必要的对象等等

因此Jenkins+PMD构建自动化静态代码检测是很有必要的


PMD下载地址:http://sourceforge.net/projects/pmd/

下载后解压即可

PMD主要可以通过ant脚本来执行,编写ant的build文件,这里新建的为如buildPMD.xml

    <?xml version="1.0" encoding="UTF-8"?>                <project name="pmd" default="pmd" basedir=".">                     <property environment="env">         <property name="ExampleProject.location" value="../ExampleProject">            <!-- 定义pmd的classpath,均为下载的pmd包解压后lib目录下的jar包-->        <path id="pmd.classpath">          <pathelement location="${basedir}/lib/asm-3.2.jar">          <pathelement location="${basedir}/lib/jaxen-1.1.1.jar">          <pathelement location="${basedir}/lib/junit-4.4.jar">          <pathelement location="${basedir}/lib/pmd-5.0.4.jar">                  <!--          <fileset dir="${basedir}/lib/">              <include name="**/*.jar">                    -->        </include></pathelement></pathelement></pathelement></pathelement></path>        <target depends="pmd_html" name="pmd">          <taskdef name="pmd" classname="net.sourceforge.pmd.ant.PMDTask" classpathref="pmd.classpath">           <!-- 定义代码检测规则,这里直接列出规则imports.xml和java-unusedcode规则,本例注释了,使用下面一种在另一文件中定义规则集-->           <!--           <pmd rulesetfiles="rulesets/java/imports.xml,java-unusedcode">          -->            <!-- 定义PMD检测规则所在的文件,规则集在pmdrule.xml文件中定义-->            <pmd rulesetfiles="${basedir}/pmdrule.xml" encoding="UTF-8">            <!-- 输出XML格式的报告-->            <formatter type="html" tofile="pmd_report.html" toconsole="true">            <!-- 静态代码检测ExampleProject工程下src目录下的所有java文件-->            <fileset dir="${ExampleProject.location}/src">                <include name="**/*.java">            </include></fileset>          </formatter></pmd>        </taskdef></target>                <target name="pmd_html">          <taskdef name="pmd" classname="net.sourceforge.pmd.ant.PMDTask" classpathref="pmd.classpath">          <!--           <pmd rulesetfiles="rulesets/java/imports.xml,java-unusedcode">         -->            <pmd rulesetfiles="${basedir}/pmdrule.xml" encoding="UTF-8">          <!-- 输出HTML格式的报告-->            <formatter type="xml" tofile="pmd_report.html" toconsole="true">            <fileset dir="${ExampleProject.location}/src">                <include name="**/*.java">            </include></fileset>          </formatter></pmd>        </taskdef></target>                </project>      本文中定义了两个target,分别生成了XML和HTML格式的报告,因为在Jenkins中的分析插件需要用XML格式才能生成视图报告,而XML格式对于团队来说不直观,不宜发送邮件,因此生成两份报告,一份用于Jenkins分析,一份发送邮件用于团队成员直接查看    编写好buildPMD.xml,直接使用ant -f buildPMD.xml即可在CMD命令或Linux shell下执行PMD静态代码检测    在Jenkins中新建个任务,Build项Add build step中选择“Execute Shell”,输入ant -f buildPMD.xml即可    附:pmdrule.xml      [xml] view plaincopy        <?xml version="1.0" encoding="UTF-8"?>        <ruleset xmlns="http://pmd.sourceforge.net/ruleset/2.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="pmdrule" xsi:schemalocation="http://pmd.sourceforge.net/ruleset/2.0.0 http://pmd.sourceforge.net/ruleset_2_0_0.xsd">           <description>PMD Plugin preferences rule set</description>           <rule ref="rulesets/java/design.xml/AbstractClassWithoutAbstractMethod">           <rule ref="rulesets/java/design.xml/AbstractClassWithoutAnyMethod">           <rule ref="rulesets/java/naming.xml/AbstractNaming">           <rule ref="rulesets/java/design.xml/AccessorClassGeneration">           <rule ref="rulesets/java/optimizations.xml/AddEmptyString">           <rule ref="rulesets/java/strings.xml/AppendCharacterWithChar">           <rule ref="rulesets/java/sunsecure.xml/ArrayIsStoredDirectly">           <rule ref="rulesets/ecmascript/basic.xml/AssignmentInOperand">           <rule ref="rulesets/java/controversial.xml/AssignmentInOperand">           <rule ref="rulesets/java/design.xml/AssignmentToNonFinalStatic">           <rule ref="rulesets/java/controversial.xml/AtLeastOneConstructor">           <rule ref="rulesets/java/controversial.xml/AvoidAccessibilityAlteration">           <rule ref="rulesets/java/optimizations.xml/AvoidArrayLoops">           <rule ref="rulesets/java/migrating.xml/AvoidAssertAsIdentifier">           <rule ref="rulesets/xsl/xpath.xml/AvoidAxisNavigation">           <rule ref="rulesets/java/basic.xml/AvoidBranchingStatementAsLastInLoop">           <rule ref="rulesets/java/finalizers.xml/AvoidCallingFinalize">           <rule ref="rulesets/java/strictexception.xml/AvoidCatchingGenericException">           <rule ref="rulesets/java/strictexception.xml/AvoidCatchingNPE">           <rule ref="rulesets/java/strictexception.xml/AvoidCatchingThrowable">           <rule ref="rulesets/java/design.xml/AvoidConstantsInterface">           <rule ref="rulesets/java/basic.xml/AvoidDecimalLiteralsInBigDecimalConstructor">           <rule ref="rulesets/java/design.xml/AvoidDeeplyNestedIfStmts">           <rule ref="rulesets/java/naming.xml/AvoidDollarSigns">           <rule ref="rulesets/java/strings.xml/AvoidDuplicateLiterals">           <rule ref="rulesets/java/migrating.xml/AvoidEnumAsIdentifier">           <rule ref="rulesets/java/naming.xml/AvoidFieldNameMatchingMethodName">           <rule ref="rulesets/java/naming.xml/AvoidFieldNameMatchingTypeName">           <rule ref="rulesets/java/controversial.xml/AvoidFinalLocalVariable">           <rule ref="rulesets/java/design.xml/AvoidInstanceofChecksInCatchClause">           <rule ref="rulesets/java/optimizations.xml/AvoidInstantiatingObjectsInLoops">           <rule ref="rulesets/java/controversial.xml/AvoidLiteralsInIfCondition">           <rule ref="rulesets/java/strictexception.xml/AvoidLosingExceptionInformation">           <rule ref="rulesets/java/basic.xml/AvoidMultipleUnaryOperators">           <rule ref="rulesets/java/controversial.xml/AvoidPrefixingMethodParameters">           <rule ref="rulesets/java/logging-java.xml/AvoidPrintStackTrace">           <rule ref="rulesets/java/design.xml/AvoidProtectedFieldInFinalClass">           <rule ref="rulesets/java/design.xml/AvoidReassigningParameters">           <rule ref="rulesets/java/strictexception.xml/AvoidRethrowingException">           <rule ref="rulesets/java/strings.xml/AvoidStringBufferField">           <rule ref="rulesets/java/design.xml/AvoidSynchronizedAtMethodLevel">           <rule ref="rulesets/java/basic.xml/AvoidThreadGroup">           <rule ref="rulesets/java/strictexception.xml/AvoidThrowingNewInstanceOfSameException">           <rule ref="rulesets/java/strictexception.xml/AvoidThrowingNullPointerException">           <rule ref="rulesets/java/strictexception.xml/AvoidThrowingRawExceptionTypes">           <rule ref="rulesets/ecmascript/basic.xml/AvoidTrailingComma">           <rule ref="rulesets/java/basic.xml/AvoidUsingHardCodedIP">           <rule ref="rulesets/java/controversial.xml/AvoidUsingNativeCode">           <rule ref="rulesets/java/basic.xml/AvoidUsingOctalValues">           <rule ref="rulesets/java/controversial.xml/AvoidUsingShortType">           <rule ref="rulesets/java/controversial.xml/AvoidUsingVolatile">           <rule ref="rulesets/java/design.xml/BadComparison">           <rule ref="rulesets/java/javabeans.xml/BeanMembersShouldSerialize">           <rule ref="rulesets/java/basic.xml/BigIntegerInstantiation">           <rule ref="rulesets/java/naming.xml/BooleanGetMethodName">           <rule ref="rulesets/java/basic.xml/BooleanInstantiation">           <rule ref="rulesets/java/controversial.xml/BooleanInversion">           <rule ref="rulesets/java/basic.xml/BrokenNullCheck">           <rule ref="rulesets/java/migrating.xml/ByteInstantiation">           <rule ref="rulesets/java/android.xml/CallSuperFirst">           <rule ref="rulesets/java/controversial.xml/CallSuperInConstructor">           <rule ref="rulesets/java/android.xml/CallSuperLast">           <rule ref="rulesets/java/basic.xml/CheckResultSet">           <rule ref="rulesets/java/basic.xml/CheckSkipResult">           <rule ref="rulesets/java/basic.xml/ClassCastExceptionWithToArray">           <rule ref="rulesets/java/naming.xml/ClassNamingConventions">           <rule ref="rulesets/java/design.xml/ClassWithOnlyPrivateConstructorsShouldBeFinal">           <rule ref="rulesets/java/clone.xml/CloneMethodMustImplementCloneable">           <rule ref="rulesets/java/clone.xml/CloneThrowsCloneNotSupportedException">           <rule ref="rulesets/java/design.xml/CloseResource">           <rule ref="rulesets/java/basic.xml/CollapsibleIfStatements">           <rule ref="rulesets/java/comments.xml/CommentContent">           <rule ref="rulesets/java/comments.xml/CommentRequired">           <rule ref="rulesets/java/comments.xml/CommentSize">           <rule ref="rulesets/java/design.xml/CompareObjectsWithEquals">           <rule ref="rulesets/java/design.xml/ConfusingTernary">           <rule ref="rulesets/java/strings.xml/ConsecutiveLiteralAppends">           <rule ref="rulesets/ecmascript/basic.xml/ConsistentReturn">           <rule ref="rulesets/java/design.xml/ConstructorCallsOverridableMethod">           <rule ref="rulesets/java/coupling.xml/CouplingBetweenObjects">           <rule ref="rulesets/java/codesize.xml/CyclomaticComplexity">           <rule ref="rulesets/java/controversial.xml/DataflowAnomalyAnalysis">           <rule ref="rulesets/java/design.xml/DefaultLabelNotLastInSwitchStmt">           <rule ref="rulesets/java/controversial.xml/DefaultPackage">           <rule ref="rulesets/java/controversial.xml/DoNotCallGarbageCollectionExplicitly">           <rule ref="rulesets/java/j2ee.xml/DoNotCallSystemExit">           <rule ref="rulesets/java/strictexception.xml/DoNotExtendJavaLangError">           <rule ref="rulesets/java/android.xml/DoNotHardCodeSDCard">           <rule ref="rulesets/java/strictexception.xml/DoNotThrowExceptionInFinally">           <rule ref="rulesets/java/j2ee.xml/DoNotUseThreads">           <rule ref="rulesets/java/basic.xml/DontCallThreadRun">           <rule ref="rulesets/java/imports.xml/DontImportJavaLang">           <rule ref="rulesets/java/controversial.xml/DontImportSun">           <rule ref="rulesets/jsp/basic-jsf.xml/DontNestJsfInJstlIteration">           <rule ref="rulesets/java/basic.xml/DontUseFloatTypeForLoopIndices">           <rule ref="rulesets/java/basic.xml/DoubleCheckedLocking">           <rule ref="rulesets/java/imports.xml/DuplicateImports">           <rule ref="rulesets/jsp/basic.xml/DuplicateJspImports">           <rule ref="rulesets/java/basic.xml/EmptyCatchBlock">           <rule ref="rulesets/java/empty.xml/EmptyCatchBlock">           <rule ref="rulesets/java/finalizers.xml/EmptyFinalizer">           <rule ref="rulesets/java/basic.xml/EmptyFinallyBlock">           <rule ref="rulesets/java/empty.xml/EmptyFinallyBlock">           <rule ref="rulesets/java/basic.xml/EmptyIfStmt">           <rule ref="rulesets/java/empty.xml/EmptyIfStmt">           <rule ref="rulesets/java/basic.xml/EmptyInitializer">           <rule ref="rulesets/java/empty.xml/EmptyInitializer">           <rule ref="rulesets/java/design.xml/EmptyMethodInAbstractClassShouldBeAbstract">           <rule ref="rulesets/java/basic.xml/EmptyStatementBlock">           <rule ref="rulesets/java/empty.xml/EmptyStatementBlock">           <rule ref="rulesets/java/basic.xml/EmptyStatementNotInLoop">           <rule ref="rulesets/java/empty.xml/EmptyStatementNotInLoop">           <rule ref="rulesets/java/basic.xml/EmptyStaticInitializer">           <rule ref="rulesets/java/empty.xml/EmptyStaticInitializer">           <rule ref="rulesets/java/basic.xml/EmptySwitchStatements">           <rule ref="rulesets/java/empty.xml/EmptySwitchStatements">           <rule ref="rulesets/java/basic.xml/EmptySynchronizedBlock">           <rule ref="rulesets/java/empty.xml/EmptySynchronizedBlock">           <rule ref="rulesets/java/basic.xml/EmptyTryBlock">           <rule ref="rulesets/java/empty.xml/EmptyTryBlock">           <rule ref="rulesets/java/basic.xml/EmptyWhileStmt">           <rule ref="rulesets/java/empty.xml/EmptyWhileStmt">           <rule ref="rulesets/ecmascript/basic.xml/EqualComparison">           <rule ref="rulesets/java/design.xml/EqualsNull">           <rule ref="rulesets/java/strictexception.xml/ExceptionAsFlowControl">           <rule ref="rulesets/java/codesize.xml/ExcessiveClassLength">           <rule ref="rulesets/java/coupling.xml/ExcessiveImports">           <rule ref="rulesets/java/codesize.xml/ExcessiveMethodLength">           <rule ref="rulesets/java/codesize.xml/ExcessiveParameterList">           <rule ref="rulesets/java/codesize.xml/ExcessivePublicCount">           <rule ref="rulesets/java/basic.xml/ExtendsObject">           <rule ref="rulesets/java/design.xml/FieldDeclarationsShouldBeAtStartOfClass">           <rule ref="rulesets/java/design.xml/FinalFieldCouldBeStatic">           <rule ref="rulesets/java/finalizers.xml/FinalizeDoesNotCallSuperFinalize">           <rule ref="rulesets/java/finalizers.xml/FinalizeOnlyCallsSuperFinalize">           <rule ref="rulesets/java/finalizers.xml/FinalizeOverloaded">           <rule ref="rulesets/java/finalizers.xml/FinalizeShouldBeProtected">           <rule ref="rulesets/java/basic.xml/ForLoopShouldBeWhileLoop">           <rule ref="rulesets/ecmascript/braces.xml/ForLoopsMustUseBraces">           <rule ref="rulesets/java/braces.xml/ForLoopsMustUseBraces">           <rule ref="rulesets/java/naming.xml/GenericsNaming">           <rule ref="rulesets/ecmascript/basic.xml/GlobalVariable">           <rule ref="rulesets/java/design.xml/GodClass">           <rule ref="rulesets/java/logging-jakarta-commons.xml/GuardDebugLogging">           <rule ref="rulesets/java/design.xml/IdempotentOperations">           <rule ref="rulesets/ecmascript/braces.xml/IfElseStmtsMustUseBraces">           <rule ref="rulesets/java/braces.xml/IfElseStmtsMustUseBraces">           <rule ref="rulesets/ecmascript/braces.xml/IfStmtsMustUseBraces">           <rule ref="rulesets/java/braces.xml/IfStmtsMustUseBraces">           <rule ref="rulesets/jsp/basic.xml/IframeMissingSrcAttribute">           <rule ref="rulesets/java/design.xml/ImmutableField">           <rule ref="rulesets/java/imports.xml/ImportFromSamePackage">           <rule ref="rulesets/java/strings.xml/InefficientEmptyStringCheck">           <rule ref="rulesets/java/strings.xml/InefficientStringBuffering">           <rule ref="rulesets/ecmascript/basic.xml/InnaccurateNumericLiteral">           <rule ref="rulesets/java/design.xml/InstantiationToGetClass">           <rule ref="rulesets/java/strings.xml/InsufficientStringBufferDeclaration">           <rule ref="rulesets/java/migrating.xml/IntegerInstantiation">           <rule ref="rulesets/java/migrating.xml/JUnit4SuitesShouldUseSuiteAnnotation">           <rule ref="rulesets/java/migrating.xml/JUnit4TestShouldUseAfterAnnotation">           <rule ref="rulesets/java/migrating.xml/JUnit4TestShouldUseBeforeAnnotation">           <rule ref="rulesets/java/migrating.xml/JUnit4TestShouldUseTestAnnotation">           <rule ref="rulesets/java/junit.xml/JUnitAssertionsShouldIncludeMessage">           <rule ref="rulesets/java/junit.xml/JUnitSpelling">           <rule ref="rulesets/java/junit.xml/JUnitStaticSuite">           <rule ref="rulesets/java/junit.xml/JUnitTestContainsTooManyAsserts">           <rule ref="rulesets/java/junit.xml/JUnitTestsShouldIncludeAssert">           <rule ref="rulesets/java/migrating.xml/JUnitUseExpected">           <rule ref="rulesets/jsp/basic.xml/JspEncoding">           <rule ref="rulesets/java/basic.xml/JumbledIncrementer">           <rule ref="rulesets/java/coupling.xml/LawOfDemeter">           <rule ref="rulesets/java/j2ee.xml/LocalHomeNamingConvention">           <rule ref="rulesets/java/j2ee.xml/LocalInterfaceSessionNamingConvention">           <rule ref="rulesets/java/optimizations.xml/LocalVariableCouldBeFinal">           <rule ref="rulesets/java/logging-java.xml/LoggerIsNotStaticFinal">           <rule ref="rulesets/java/design.xml/LogicInversion">           <rule ref="rulesets/java/migrating.xml/LongInstantiation">           <rule ref="rulesets/java/naming.xml/LongVariable">           <rule ref="rulesets/java/coupling.xml/LooseCoupling">           <rule ref="rulesets/java/coupling.xml/LoosePackageCoupling">           <rule ref="rulesets/java/j2ee.xml/MDBAndSessionBeanNamingConvention">           <rule ref="rulesets/java/optimizations.xml/MethodArgumentCouldBeFinal">           <rule ref="rulesets/java/naming.xml/MethodNamingConventions">           <rule ref="rulesets/java/sunsecure.xml/MethodReturnsInternalArray">           <rule ref="rulesets/java/naming.xml/MethodWithSameNameAsEnclosingClass">           <rule ref="rulesets/java/naming.xml/MisleadingVariableName">           <rule ref="rulesets/java/basic.xml/MisplacedNullCheck">           <rule ref="rulesets/java/design.xml/MissingBreakInSwitch">           <rule ref="rulesets/java/javabeans.xml/MissingSerialVersionUID">           <rule ref="rulesets/java/design.xml/MissingStaticMethodInNonInstantiatableClass">           <rule ref="rulesets/xml/basic.xml/MistypedCDATASection">           <rule ref="rulesets/java/logging-java.xml/MoreThanOneLogger">           <rule ref="rulesets/java/codesize.xml/NPathComplexity">           <rule ref="rulesets/java/codesize.xml/NcssConstructorCount">           <rule ref="rulesets/java/codesize.xml/NcssMethodCount">           <rule ref="rulesets/java/codesize.xml/NcssTypeCount">           <rule ref="rulesets/jsp/basic.xml/NoClassAttribute">           <rule ref="rulesets/jsp/basic.xml/NoHtmlComments">           <rule ref="rulesets/jsp/basic.xml/NoInlineScript">           <rule ref="rulesets/jsp/basic.xml/NoInlineStyleInformation">           <rule ref="rulesets/jsp/basic.xml/NoJspForward">           <rule ref="rulesets/jsp/basic.xml/NoLongScripts">           <rule ref="rulesets/java/naming.xml/NoPackage">           <rule ref="rulesets/jsp/basic.xml/NoScriptlets">           <rule ref="rulesets/java/design.xml/NonCaseLabelInSwitchStatement">           <rule ref="rulesets/java/design.xml/NonStaticInitializer">           <rule ref="rulesets/java/design.xml/NonThreadSafeSingleton">           <rule ref="rulesets/java/controversial.xml/NullAssignment">           <rule ref="rulesets/java/controversial.xml/OneDeclarationPerLine">           <rule ref="rulesets/java/controversial.xml/OnlyOneReturn">           <rule ref="rulesets/java/design.xml/OptimizableToArrayCall">           <rule ref="rulesets/java/basic.xml/OverrideBothEqualsAndHashcode">           <rule ref="rulesets/java/naming.xml/PackageCase">           <rule ref="rulesets/java/design.xml/PositionLiteralsFirstInComparisons">           <rule ref="rulesets/java/optimizations.xml/PrematureDeclaration">           <rule ref="rulesets/java/design.xml/PreserveStackTrace">           <rule ref="rulesets/java/clone.xml/ProperCloneImplementation">           <rule ref="rulesets/java/logging-jakarta-commons.xml/ProperLogger">           <rule ref="rulesets/java/optimizations.xml/RedundantFieldInitializer">           <rule ref="rulesets/java/j2ee.xml/RemoteInterfaceNamingConvention">           <rule ref="rulesets/java/j2ee.xml/RemoteSessionInterfaceNamingConvention">           <rule ref="rulesets/java/migrating.xml/ReplaceEnumerationWithIterator">           <rule ref="rulesets/java/migrating.xml/ReplaceHashtableWithMap">           <rule ref="rulesets/java/migrating.xml/ReplaceVectorWithList">           <rule ref="rulesets/java/design.xml/ReturnEmptyArrayRatherThanNull">           <rule ref="rulesets/java/basic.xml/ReturnFromFinallyBlock">           <rule ref="rulesets/ecmascript/basic.xml/ScopeForInVariable">           <rule ref="rulesets/java/naming.xml/ShortClassName">           <rule ref="rulesets/java/migrating.xml/ShortInstantiation">           <rule ref="rulesets/java/naming.xml/ShortMethodName">           <rule ref="rulesets/java/naming.xml/ShortVariable">           <rule ref="rulesets/java/strictexception.xml/SignatureDeclareThrowsException">           <rule ref="rulesets/java/design.xml/SimpleDateFormatNeedsLocale">           <rule ref="rulesets/java/junit.xml/SimplifyBooleanAssertion">           <rule ref="rulesets/java/design.xml/SimplifyBooleanExpressions">           <rule ref="rulesets/java/design.xml/SimplifyBooleanReturns">           <rule ref="rulesets/java/design.xml/SimplifyConditional">           <rule ref="rulesets/java/optimizations.xml/SimplifyStartsWith">           <rule ref="rulesets/java/design.xml/SingularField">           <rule ref="rulesets/java/j2ee.xml/StaticEJBFieldShouldBeFinal">           <rule ref="rulesets/java/strings.xml/StringBufferInstantiationWithChar">           <rule ref="rulesets/java/strings.xml/StringInstantiation">           <rule ref="rulesets/java/strings.xml/StringToString">           <rule ref="rulesets/java/naming.xml/SuspiciousConstantFieldName">           <rule ref="rulesets/java/naming.xml/SuspiciousEqualsMethodName">           <rule ref="rulesets/java/naming.xml/SuspiciousHashcodeMethodName">           <rule ref="rulesets/java/controversial.xml/SuspiciousOctalEscape">           <rule ref="rulesets/java/design.xml/SwitchDensity">           <rule ref="rulesets/java/design.xml/SwitchStmtsShouldHaveDefault">           <rule ref="rulesets/java/logging-java.xml/SystemPrintln">           <rule ref="rulesets/java/junit.xml/TestClassWithoutTestCases">           <rule ref="rulesets/java/design.xml/TooFewBranchesForASwitchStatement">           <rule ref="rulesets/java/codesize.xml/TooManyFields">           <rule ref="rulesets/java/codesize.xml/TooManyMethods">           <rule ref="rulesets/java/imports.xml/TooManyStaticImports">           <rule ref="rulesets/java/design.xml/UncommentedEmptyConstructor">           <rule ref="rulesets/java/design.xml/UncommentedEmptyMethod">           <rule ref="rulesets/java/basic.xml/UnconditionalIfStatement">           <rule ref="rulesets/ecmascript/unnecessary.xml/UnnecessaryBlock">           <rule ref="rulesets/java/junit.xml/UnnecessaryBooleanAssertion">           <rule ref="rulesets/java/strings.xml/UnnecessaryCaseChange">           <rule ref="rulesets/java/controversial.xml/UnnecessaryConstructor">           <rule ref="rulesets/java/unnecessary.xml/UnnecessaryConversionTemporary">           <rule ref="rulesets/java/basic.xml/UnnecessaryConversionTemporary">           <rule ref="rulesets/java/unnecessary.xml/UnnecessaryFinalModifier">           <rule ref="rulesets/java/basic.xml/UnnecessaryFinalModifier">           <rule ref="rulesets/java/imports.xml/UnnecessaryFullyQualifiedName">           <rule ref="rulesets/java/design.xml/UnnecessaryLocalBeforeReturn">           <rule ref="rulesets/ecmascript/unnecessary.xml/UnnecessaryParentheses">           <rule ref="rulesets/java/controversial.xml/UnnecessaryParentheses">           <rule ref="rulesets/java/unnecessary.xml/UnnecessaryReturn">           <rule ref="rulesets/java/basic.xml/UnnecessaryReturn">           <rule ref="rulesets/java/optimizations.xml/UnnecessaryWrapperObjectCreation">           <rule ref="rulesets/ecmascript/basic.xml/UnreachableCode">           <rule ref="rulesets/java/design.xml/UnsynchronizedStaticDateFormatter">           <rule ref="rulesets/java/unusedcode.xml/UnusedFormalParameter">           <rule ref="rulesets/java/imports.xml/UnusedImports">           <rule ref="rulesets/java/unusedcode.xml/UnusedLocalVariable">           <rule ref="rulesets/java/unusedcode.xml/UnusedModifier">           <rule ref="rulesets/java/unnecessary.xml/UnusedNullCheckInEquals">           <rule ref="rulesets/java/basic.xml/UnusedNullCheckInEquals">           <rule ref="rulesets/java/unusedcode.xml/UnusedPrivateField">           <rule ref="rulesets/java/unusedcode.xml/UnusedPrivateMethod">           <rule ref="rulesets/java/optimizations.xml/UseArrayListInsteadOfVector">           <rule ref="rulesets/java/optimizations.xml/UseArraysAsList">           <rule ref="rulesets/java/junit.xml/UseAssertEqualsInsteadOfAssertTrue">           <rule ref="rulesets/java/junit.xml/UseAssertNullInsteadOfAssertTrue">           <rule ref="rulesets/java/junit.xml/UseAssertSameInsteadOfAssertTrue">           <rule ref="rulesets/java/junit.xml/UseAssertTrueInsteadOfAssertEquals">           <rule ref="rulesets/java/design.xml/UseCollectionIsEmpty">           <rule ref="rulesets/xsl/xpath.xml/UseConcatOnce">           <rule ref="rulesets/java/controversial.xml/UseConcurrentHashMap">           <rule ref="rulesets/java/logging-jakarta-commons.xml/UseCorrectExceptionLogging">           <rule ref="rulesets/java/strings.xml/UseEqualsToCompareStrings">           <rule ref="rulesets/java/strings.xml/UseIndexOfChar">           <rule ref="rulesets/java/design.xml/UseLocaleWithCaseConversions">           <rule ref="rulesets/java/design.xml/UseNotifyAllInsteadOfNotify">           <rule ref="rulesets/java/controversial.xml/UseObjectForClearerAPI">           <rule ref="rulesets/java/j2ee.xml/UseProperClassLoader">           <rule ref="rulesets/java/design.xml/UseSingleton">           <rule ref="rulesets/java/optimizations.xml/UseStringBufferForStringAppends">           <rule ref="rulesets/java/strings.xml/UseStringBufferLength">           <rule ref="rulesets/java/design.xml/UseVarargs">           <rule ref="rulesets/java/unnecessary.xml/UselessOperationOnImmutable">           <rule ref="rulesets/java/basic.xml/UselessOperationOnImmutable">           <rule ref="rulesets/java/unnecessary.xml/UselessOverridingMethod">           <rule ref="rulesets/java/basic.xml/UselessOverridingMethod">           <rule ref="rulesets/java/unnecessary.xml/UselessParentheses">           <rule ref="rulesets/java/basic.xml/UselessParentheses">           <rule ref="rulesets/java/strings.xml/UselessStringValueOf">           <rule ref="rulesets/java/naming.xml/VariableNamingConventions">           <rule ref="rulesets/ecmascript/braces.xml/WhileLoopsMustUseBraces">           <rule ref="rulesets/java/braces.xml/WhileLoopsMustUseBraces">  

关于PMD rulesets规则的意思可以查看:http://pmd.sourceforge.net/pmd-5.0.4/rules/index.html