Skip to content

Checkstyle et Maven : configuration de plugin ignorée

NOTE :
J'ai résolu le problème juste avant que je ne publie l'issue, donc je la poste tout de même au cas où quelqu'un rencontrerait le même problème. J'ai ajouté la solution (en fait très simple) à notre problème à la fin.

ISSUE ORIGINALE :

Bonjour,
comme le titre l'indique, j'ai rencontré un problème avec Maven et le checkstyle. Le but serait d'utiliser un checkstyle custom (récupéré du projet de MIF01) qui serait vérifié lors de l'exécution des tests via mvn tests.
Seulement, j'ai remarqué aujourd'hui que malgré la configuration qui a l'air correcte du plugin de checkstyle :

  1. mvn test n'exécute pas les tests de checkstyle
  2. mvn checkstyle:check utilise le checkstyle par défaut plutôt que le nôtre

Et ce en local, et par conséquent sur la CI (c'est d'ailleurs en remarquant des erreurs de style sur un push dont la pipeline avait réussi qu'on s'en est rendus compte).

J'ai cru au départ en vérifiant sur la documentation du plugin qu'il s'agissait d'une incompatibilité entre la version du compilateur Maven ou de la version de Java utilisée, mais après avoir vérifié la version de Java (13 pour moi, 11 sur la VM et pour un de mes collègues) et essayé de changer la version du compilateur Maven (1.8 ou plus au lieu de 1.7, généré par l'archétype) ou du plugin (2.15 au lieu de 3.1.1), rien ne semble changer au problème...

En exécutant mvn checkstyle:check -e -X pour avoir les traces et les infos de debug, je ne trouve pas non plus de message qui indiquerait que le fichier de checkstyle n'est pas trouvé par le plugin, et il semblerait même que le plugin ignore les paramètres spécifiés dans notre pom.xml.

Notre configuration, avec . le dossier du projet Java (l'issue sur notre projet, pas encore de changements puisque les tests sont faits en local pour le moment) :

  • ./src/main/config/checkstyle.xml => le fichier de checkstyle
  • ./pom.xml, avec la configuration du plugin comme suit (très inspirée de celle de MIF01 et de la documentation du plugin) :
<!-- Checkstyle plugin -->
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-checkstyle-plugin</artifactId>
  <! -- aussi essayé avec 2.15 -->
  <version>3.1.1</version>
  <executions>
    <execution>
      <id>testCheckstyle</id>
      <!-- devrait associer le goal à `mvn test` -->
      <phase>test</phase>
      <configuration>
        <!-- mais le goal utilise le checkstyle par défaut à la place,
             déplacer le fichier ne change rien (ex: `./checkstyle.xml`) -->
        <configLocation>src/main/config/checkstyle.xml</configLocation>
        <!-- le reste de la configuration semble respecté -->
        <encoding>UTF-8</encoding>
        <consoleOutput>true</consoleOutput>
        <failsOnError>true</failsOnError>
        <violationSeverity>warning</violationSeverity>
      </configuration>
      <goals>
        <goal>check</goal>
      </goals>
    </execution>
  </executions>
</plugin>

Un extrait de la trace de debug :

Configuring mojo 'org.apache.maven.plugins:maven-checkstyle-plugin:2.15:check' with basic configurator -->
  (f) configLocation = config/sun_checks.xml
  (f) consoleOutput = false
  (f) encoding = UTF-8
  (f) failOnViolation = true
  (f) failsOnError = false
...

Et pourtant, les autres plugins (comme JUnit) s'exécutent correctement, probablement grâce aux valeurs par défaut.
Je ne trouve pas beaucoup d'informations en ligne sur des problèmes du même genre et je commence à être un peu à court, mais je voulais aussi savoir, puisqu'il est fait mention de SonarQube dans la présentation du projet, s'il était possible de passer outre ce problème pour préférer mettre en place SonarQube dans la CI avec Checkstyle.

Merci d'avance.

SOLUTION :

Après avoir trouvé cette page, il s'avère que j'avais juste mal placé la configuration du plugin dans le pom.xml. À la place de :

<build>
  <pluginManagement>
    <plugins>
      <plugin>
        <!-- configuration du plugin -->
      </plugin>
    </plugins>
  </pluginManagement>
</build>

il faut déplacer la configuration du plugin en-dehors de la balise pluginManagement, comme suit :

<build>
  <pluginManagement>
    <plugins>
      <plugin>
        <!-- plugin avec options par défaut -->
      </plugin>
    </plugins>
  </pluginManagement>

  <plugins>
    <plugin>
      <!-- plugin checkstyle -->
    </plugin>
  </plugins>
</build>

En espérant que ça puisse servir à quelqu'un.