Jenkins+PMD構建自動化靜態代碼檢測

jopen 9年前發布 | 63K 次閱讀 PMD 代碼分析/審查/優化

前言:軟件缺陷是不可避免的,要盡量減少錯誤并提高軟件質量,主要有兩在類技術,即缺陷預防和缺陷檢測

缺陷預防包括編寫更好的設計規范、實施代碼審核制度、運行代碼靜態分析工具、運行單元測試等

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">  </pre><br />

關于PMD rulesets規則的意思可以查看:http://pmd.sourceforge.net/pmd-5.0.4/rules/index.html


 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!