Search code examples
javamavenpmd

With pmd rulesets in maven, how do you select an individual rule?


I'm using the following to look at bad exception patterns in PMD in maven:

<configuration>
    <rulesets>
        <ruleset>/rulesets/java/strictexception.xml</ruleset>
    </rulesets>
</configuration>

This is what I want to do, but it doesn't work (for diagnostics and focusing on particular needs)

<configuration>
    <rulesets>
        <ruleset>/rulesets/java/strictexception.xml/AvoidCatchingThrowable</ruleset>
        <ruleset>/rulesets/java/strictexception.xml/SignatureDeclareThrowsException</ruleset>
        <ruleset>/rulesets/java/strictexception.xml/ExceptionAsFlowControl</ruleset>
        <ruleset>/rulesets/java/strictexception.xml/AvoidCatchingNPE</ruleset>
        <ruleset>/rulesets/java/strictexception.xml/AvoidThrowingRawExceptionTypes</ruleset>
        <ruleset>/rulesets/java/strictexception.xml/AvoidThrowingNullPointerException</ruleset>
        <ruleset>/rulesets/java/strictexception.xml/AvoidRethrowingException</ruleset>
        <ruleset>/rulesets/java/strictexception.xml/DoNotExtendJavaLangError</ruleset>
        <ruleset>/rulesets/java/strictexception.xml/DoNotThrowExceptionInFinally</ruleset>
        <ruleset>/rulesets/java/strictexception.xml/AvoidThrowingNewInstanceOfSameException</ruleset>
        <ruleset>/rulesets/java/strictexception.xml/AvoidCatchingGenericException</ruleset>
        <ruleset>/rulesets/java/strictexception.xml/AvoidLosingExceptionInformation</ruleset> -->
    </rulesets>
</configuration>

My question is: With pmd rulesets in maven, how do you select an individual rule?


Solution

  • This is not directly possible with maven.

    I'd recommend creating a custom ruleset file and reference this single ruleset in pom.xml instead.

    Custom Ruleset File: http://pmd.sourceforge.net/pmd-5.2.3/customizing/howtomakearuleset.html

    Example (filename custom-ruleset.xml):

    <?xml version="1.0"?>
    <ruleset name="Custom ruleset"
        xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 http://pmd.sourceforge.net/ruleset_2_0_0.xsd">
      <description>
        Only some selected rules for bad exception patterns
      </description>
    
      <rule ref="rulesets/java/strictexception.xml/AvoidCatchingThrowable" />
      <rule ref="rulesets/java/strictexception.xml/SignatureDeclareThrowsException" />
      <rule ref="rulesets/java/strictexception.xml/ExceptionAsFlowControl" />
      <rule ref="rulesets/java/strictexception.xml/AvoidCatchingNPE" />
      <rule ref="rulesets/java/strictexception.xml/AvoidThrowingRawExceptionTypes" />
      <rule ref="rulesets/java/strictexception.xml/AvoidThrowingNullPointerException" />
      <rule ref="rulesets/java/strictexception.xml/AvoidRethrowingException" />
      <rule ref="rulesets/java/strictexception.xml/DoNotExtendJavaLangError" />
      <rule ref="rulesets/java/strictexception.xml/DoNotThrowExceptionInFinally" />
      <rule ref="rulesets/java/strictexception.xml/AvoidThrowingNewInstanceOfSameException" />
      <rule ref="rulesets/java/strictexception.xml/AvoidCatchingGenericException" />
      <rule ref="rulesets/java/strictexception.xml/AvoidLosingExceptionInformation" />
    
    </ruleset>
    

    Please note, that you need to specify the original ruleset name without a leading slash, otherwise PMD won't find the ruleset. There are also a couple of other tricks possible with a custom ruleset, e.g. importing a complete ruleset but exclude one or more rules.

    Maven PMD Configuration:

    <configuration>
        <rulesets>
            <ruleset>custom-ruleset.xml</ruleset>
        </rulesets>
    </configuration>