2017-07-25 4 views
0

J'utilise les rulesets strings.xml et unusedcode.xml avecUnusedFormalParameter contre AvoidDuplicateLiterals dans maven-plugin-PMD

<?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> 
     The default ruleset 
    </description> 
    <rule ref="rulesets/java/strings.xml"/> 
    <rule ref="rulesets/java/unusedcode.xml"/> 
</ruleset> 

dans le maven-pmd-plugin intégrés comme suit:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-pmd-plugin</artifactId> 
    <version>3.8</version> 
    <executions> 
     <execution> 
      <id>pmd-check</id> 
      <phase>validate</phase> 
      <goals> 
       <goal>check</goal> 
      </goals> 
     </execution> 
    </executions> 
    <configuration> 
     <printFailingErrors>true</printFailingErrors> 
     <detail>true</detail> 
     <rulesets> 
      <ruleset>${basedir}/src/main/resources/ruleset.xml</ruleset> 
     </rulesets> 
    </configuration> 
</plugin> 

Alors que je reçois le problème suivant dans le cas d'utilisation suivant:

 
public class NewClass { 
    private final static String PMD_UNUSED_FORMAL_PARAMETER = "PMD.UnusedFormalParameter"; 

    @SuppressWarnings(PMD_UNUSED_FORMAL_PARAMETER) 
    private void someMethod1(Object parameter1) { 
     System.out.println("someMethod1"); 
    } 

    @SuppressWarnings("PMD.UnusedFormalParameter") 
    private void someMethod2(Object parameter1) { 
     System.out.println("someMethod2"); 
    } 

    @SuppressWarnings("PMD.UnusedFormalParameter") 
    private void someMethod3(Object parameter1) { 
     System.out.println("someMethod3"); 
    } 

    @SuppressWarnings("PMD.UnusedFormalParameter") 
    private void someMethod4(Object parameter1) { 
     System.out.println("someMethod4"); 
    } 

    public static void main(String[] args) { 
     NewClass newClazz = new NewClass(); 
     newClazz.someMethod1(null); 
     newClazz.someMethod2(null); 
     newClazz.someMethod3(null); 
    } 
} 

la valeur du paramètre d'annotation "PMD.UnusedFormalParameter" apparaît 4 fois entraîne une violation AvoidDuplicateLiterals. le remplacement de la chaîne par la constante private final static commentée provoque l'annulation de l'annotation et donc une violation UnusedFormalParameter.

Je ne connais pas les internes de PMD. En tant qu'utilisateur prêt à l'emploi, il semble étrange que PMD ne substitue pas la variable à sa valeur (même s'il s'agit probablement d'une tâche sensible au contexte, cela devrait être possible dans le cadre de l'analyse de code statique). et que UnusedFormalParameter n'exclut pas les valeurs de chaîne qui sont évidemment utilisées pour supprimer d'autres vérifications et ne sont présentes qu'à cause de PMD. J'utilise maven-pmd-plugin 3.8.

Répondre

1

Quant à votre question, il y a actuellement 2 façons dont vous pouvez contourner ce problème:

  1. AvoidDuplicateLiterals permet une propriété skipAnnotations qui peut être réglé sur true ignorer littéraux dans les annotations. Bien sûr, cela ignorerait tous les littéraux dans toutes les annotations, pas seulement @SuppressWarnings
  2. Toutes les règles vous permettent de configurer une propriété violationSuppressXPath avec une expression XPath d'expressions à ignorer. Par exemple, dans ce cas, vous pouvez définir la règle AvoidDuplicateLiterals pour ignorer les littéraux sur @SuppressWarnings. Je crois que la bonne expression pour ce serait //Annotation//Name[@Image = "SuppressWarnings" or @Image = "java.lang.SuppressWarnings"]/..//Literal (vous auriez à le tester pour vous assurer)

Je ne sais pas sur les entrailles de PMD. En tant qu'utilisateur prêt à l'emploi, il semble étrange que PMD ne substitue pas la variable à sa valeur (même s'il s'agit probablement d'une tâche sensible au contexte, cela devrait être possible dans le cadre de l'analyse de code statique).

Vous avez raison, ce comportement n'est actuellement pas pris en charge. J'ai juste added an issue on Github pour suivre la demande. N'hésitez pas à vous y mettre.