Can't import PMD Ruleset in Eclipse

后端 未结 6 2237
旧时难觅i
旧时难觅i 2021-02-14 03:24

I would like to use the same Ruleset in my IDE (Eclipse) that my Sonar profile.

I got the PMD XML ruleset from the Sonar Permalinks and would like to import it into my P

相关标签:
6条回答
  • 2021-02-14 03:50

    The advice from Ivan Nikolov helped me, but I had to also change one rule from:

    <rule ref="rulesets/java/controversial.xml/UnusedModifier">
      <priority>5</priority>
    </rule>
    

    to

    <rule ref="rulesets/java/unusedcode.xml/UnusedModifier">
      <priority>5</priority>
    </rule>
    

    Here is my PMD configuration file from sonar which is working for me with PMD-plugin 4.0.2.:

    <?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="pmd-eclipse"
             xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 http://pmd.sourceforge.net/ruleset_2_0_0.xsd">
      <rule ref="rulesets/java/basic.xml/UnusedNullCheckInEquals">
        <priority>3</priority>
      </rule>
      <rule ref="rulesets/java/strings.xml/StringInstantiation">
        <priority>3</priority>
      </rule>
      <rule ref="rulesets/java/design.xml/ConstructorCallsOverridableMethod">
        <priority>3</priority>
      </rule>
      <rule ref="rulesets/java/strictexception.xml/AvoidCatchingNPE">
        <priority>3</priority>
      </rule>
      <rule ref="rulesets/java/strictexception.xml/AvoidRethrowingException">
        <priority>3</priority>
      </rule>
      <rule ref="rulesets/java/migrating.xml/ReplaceEnumerationWithIterator">
        <priority>3</priority>
      </rule>
      <rule ref="rulesets/java/optimizations.xml/AvoidArrayLoops">
        <priority>3</priority>
      </rule>
      <rule ref="rulesets/java/unusedcode.xml/UnusedFormalParameter">
        <priority>3</priority>
      </rule>
      <rule ref="rulesets/java/basic.xml/ClassCastExceptionWithToArray">
        <priority>3</priority>
      </rule>
      <rule ref="rulesets/java/strictexception.xml/AvoidThrowingNullPointerException">
        <priority>3</priority>
      </rule>
      <rule ref="rulesets/java/unusedcode.xml/UnusedPrivateField">
        <priority>3</priority>
      </rule>
      <rule ref="rulesets/java/design.xml/CompareObjectsWithEquals">
        <priority>3</priority>
      </rule>
      <rule ref="rulesets/java/strings.xml/UseIndexOfChar">
        <priority>3</priority>
      </rule>
      <rule ref="rulesets/java/basic.xml/BigIntegerInstantiation">
        <priority>3</priority>
      </rule>
      <rule ref="rulesets/java/design.xml/FinalFieldCouldBeStatic">
        <priority>4</priority>
      </rule>
      <rule ref="rulesets/java/naming.xml/SuspiciousEqualsMethodName">
        <priority>2</priority>
      </rule>
      <rule ref="rulesets/java/design.xml/InstantiationToGetClass">
        <priority>3</priority>
      </rule>
      <rule ref="rulesets/java/naming.xml/SuspiciousHashcodeMethodName">
        <priority>3</priority>
      </rule>
      <rule ref="rulesets/java/coupling.xml/LooseCoupling">
        <priority>3</priority>
      </rule>
      <rule ref="rulesets/java/unusedcode.xml/UnusedLocalVariable">
        <priority>3</priority>
      </rule>
      <rule ref="rulesets/java/strings.xml/UnnecessaryCaseChange">
        <priority>4</priority>
      </rule>
      <rule ref="rulesets/java/design.xml/SingularField">
        <priority>4</priority>
      </rule>
      <rule ref="rulesets/java/design.xml/CloseResource">
        <priority>3</priority>
      </rule>
      <rule ref="rulesets/java/strictexception.xml/AvoidCatchingThrowable">
        <priority>2</priority>
      </rule>
      <rule ref="rulesets/java/basic.xml/CollapsibleIfStatements">
        <priority>4</priority>
      </rule>
      <rule ref="rulesets/java/basic.xml/UselessOperationOnImmutable">
        <priority>2</priority>
      </rule>
      <rule ref="rulesets/java/clone.xml/CloneMethodMustImplementCloneable">
        <priority>3</priority>
      </rule>
      <rule ref="rulesets/java/basic.xml/UselessOverridingMethod">
        <priority>3</priority>
      </rule>
      <rule ref="rulesets/java/unusedcode.xml/UnusedModifier">
        <priority>5</priority>
      </rule>
      <rule ref="rulesets/java/design.xml/PreserveStackTrace">
        <priority>3</priority>
      </rule>
      <rule ref="rulesets/java/optimizations.xml/UseArraysAsList">
        <priority>3</priority>
      </rule>
      <rule ref="rulesets/java/design.xml/EqualsNull">
        <priority>2</priority>
      </rule>
      <rule ref="rulesets/java/basic.xml/BrokenNullCheck">
        <priority>2</priority>
      </rule>
      <rule ref="rulesets/java/logging-jakarta-commons.xml/UseCorrectExceptionLogging">
        <priority>3</priority>
      </rule>
      <rule ref="rulesets/java/strings.xml/InefficientStringBuffering">
        <priority>3</priority>
      </rule>
      <rule ref="rulesets/java/sunsecure.xml/ArrayIsStoredDirectly">
        <priority>2</priority>
      </rule>
      <rule ref="rulesets/java/finalizers.xml/FinalizeOverloaded">
        <priority>3</priority>
      </rule>
      <rule ref="rulesets/java/controversial.xml/DontImportSun">
        <priority>4</priority>
      </rule>
      <rule ref="rulesets/java/imports.xml/DontImportJavaLang">
        <priority>4</priority>
      </rule>
      <rule ref="rulesets/java/design.xml/MissingStaticMethodInNonInstantiatableClass">
        <priority>3</priority>
      </rule>
      <rule ref="rulesets/java/strings.xml/StringBufferInstantiationWithChar">
        <priority>3</priority>
      </rule>
      <rule ref="rulesets/java/optimizations.xml/UseArrayListInsteadOfVector">
        <priority>3</priority>
      </rule>
      <rule ref="rulesets/java/strings.xml/StringToString">
        <priority>3</priority>
      </rule>
      <rule ref="rulesets/java/design.xml/SimplifyConditional">
        <priority>3</priority>
      </rule>
      <rule ref="rulesets/java/migrating.xml/ReplaceVectorWithList">
        <priority>3</priority>
      </rule>
      <rule ref="rulesets/java/codesize.xml/NcssMethodCount">
        <priority>3</priority>
        <properties>
          <property name="minimum" value="50" />
        </properties>
      </rule>
      <rule ref="rulesets/java/logging-java.xml/AvoidPrintStackTrace">
        <priority>3</priority>
      </rule>
      <rule ref="rulesets/java/naming.xml/MethodWithSameNameAsEnclosingClass">
        <priority>3</priority>
      </rule>
      <rule ref="rulesets/java/naming.xml/SuspiciousConstantFieldName">
        <priority>3</priority>
      </rule>
      <rule ref="rulesets/java/codesize.xml/NcssTypeCount">
        <priority>3</priority>
        <properties>
          <property name="minimum" value="800" />
        </properties>
      </rule>
      <rule ref="rulesets/java/design.xml/AvoidInstanceofChecksInCatchClause">
        <priority>4</priority>
      </rule>
      <rule ref="rulesets/java/migrating.xml/IntegerInstantiation">
        <priority>3</priority>
      </rule>
      <rule ref="rulesets/java/migrating.xml/AvoidAssertAsIdentifier">
        <priority>3</priority>
      </rule>
      <rule ref="rulesets/java/design.xml/UnnecessaryLocalBeforeReturn">
        <priority>3</priority>
      </rule>
      <rule ref="rulesets/java/finalizers.xml/AvoidCallingFinalize">
        <priority>3</priority>
      </rule>
      <rule ref="rulesets/java/basic.xml/BooleanInstantiation">
        <priority>3</priority>
      </rule>
      <rule ref="rulesets/java/basic.xml/UnconditionalIfStatement">
        <priority>2</priority>
      </rule>
      <rule ref="rulesets/java/clone.xml/CloneThrowsCloneNotSupportedException">
        <priority>3</priority>
      </rule>
      <rule ref="rulesets/java/migrating.xml/ReplaceHashtableWithMap">
        <priority>3</priority>
      </rule>
      <rule ref="rulesets/java/basic.xml/AvoidDecimalLiteralsInBigDecimalConstructor">
        <priority>3</priority>
      </rule>
      <rule ref="rulesets/java/strictexception.xml/SignatureDeclareThrowsException">
        <priority>3</priority>
      </rule>
      <rule ref="rulesets/java/finalizers.xml/EmptyFinalizer">
        <priority>3</priority>
      </rule>
      <rule ref="rulesets/java/design.xml/IdempotentOperations">
        <priority>3</priority>
      </rule>
      <rule ref="rulesets/java/strictexception.xml/ExceptionAsFlowControl">
        <priority>3</priority>
      </rule>
      <rule ref="rulesets/java/finalizers.xml/FinalizeDoesNotCallSuperFinalize">
        <priority>3</priority>
      </rule>
      <rule ref="rulesets/java/strings.xml/UseStringBufferLength">
        <priority>4</priority>
      </rule>
      <rule ref="rulesets/java/migrating.xml/AvoidEnumAsIdentifier">
        <priority>3</priority>
      </rule>
      <rule ref="rulesets/java/logging-java.xml/SystemPrintln">
        <priority>3</priority>
      </rule>
      <rule ref="rulesets/java/strings.xml/UselessStringValueOf">
        <priority>4</priority>
      </rule>
      <rule ref="rulesets/java/strings.xml/AvoidDuplicateLiterals">
        <priority>3</priority>
      </rule>
    </ruleset>
    
    0 讨论(0)
  • 2021-02-14 03:52

    I had to add the language to my XPath rule(s) as well, e.g:

    <rule name="DontUseDate" language="java" class="net.sourceforge.pmd.lang.rule.XPathRule" ...></rule>
    
    0 讨论(0)
  • 2021-02-14 03:53

    Why don't you use Sonar Eclipse ? You wouldn't need to worry about synchronization of rule sets.

    0 讨论(0)
  • 2021-02-14 04:01

    Ivan Nikolov's answer is correct. Your problem are different versions of ruleset format . In my case I was trying to import ruleset exported from PMD plugin version 3.2.6 into plugin version 4.0.0. Here are my findings:

    • Path change that Ivan Nikolov mentioned is needed for all the rules. Be careful because not all the rules belong to java (I saw also rules for XML,...). I am not that deep into PMD, so I don't know in which version were rules for other technologies introduced.
    • It is useful to export default ruleset of PMD plugin 4.0.0 for comparison with old custom ruleset file. This way you can fix problems that can be spotted at next point.
    • During your behavior was thrown exception that wasn't visualized. This exception can be seen in your workspace log file (/.metadata/.log) at the end. This can give you a clue what else needs to be changed. Use the previous point to find out how to fix problems. In my case it was changed path of one rule from to

    After these changes I was able to import manually migrated custom ruleset file into PMD plugin 4.0.0.

    Hope this helps.

    BTW: I find 4.0.0 version of PMD plugin very buggy so I downgraded back to 3.2.6

    0 讨论(0)
  • 2021-02-14 04:05

    In addition to what others said, you may also have to find this:

    net.sourceforge.pmd.rules.XPathRule
    

    and replace it by this:

    net.sourceforge.pmd.lang.rule.XPathRule
    
    0 讨论(0)
  • 2021-02-14 04:16

    The problem could be that Sonar is exporting your ruleset for v4.x format and your Eclipse plugin expects them in v5.x format.

    Try changing your rules from:

    <rule ref="rulesets/basic.xml/UnusedNullCheckInEquals">
        <priority>3</priority>
    </rule>
    

    to

    <rule ref="rulesets/java/basic.xml/UnusedNullCheckInEquals">
        <priority>3</priority>
    </rule>
    

    Please note the ref attribute. A simple find and replace all will work out fine for you.

    0 讨论(0)
提交回复
热议问题