Configuration SonarQube + Lombok
je suis en train de créer un nouveau projet et j'ai besoin d'Utiliser SonarQube
, et je veux utiliser Lombok
, Je l'ai déjà configuré dans Eclipse et tout fonctionne bien sauf l'analyse statique.
- champs privés inutilisés: quand j'ai un
@Data
classe, tous les champs sont déclarés comme desUnused private field
. @Getter(lazy=true)
: quand j'utilise cette annotation j'obtiens leRedundant nullcheck of value known to be non-null
voir @Getter (lazy=true) (ceci est lié au code compilé).
je pense que une solution possible est delombok
le projet, compiler et exécuter Sonar.
questions similaires dans SonarQube Jira
:
- [CodeGen - Lombok] fausse alerte indice (champ privé non utilisé)
- Fournir une nouvelle java règle de vérifier inutilisés domaine privé et qui serait en charge du bytecode génération (cd Lombok)
- [CodeGen - Lombok] fausse alerte indice
(@SuppressWarnings("PMD.UnusedPrivateField")
la solution ne fonctionne pas avec la dernière SonarQube 4.2
)
Comment puis-je résoudre ce problème?
4 réponses
comme solution de contournement, je laisse maintenant sonar faire l'analyse du code généré par delombok.
je suppose que ce n'est pas non plus une solution parfaite, parce que j'analyse le code généré au lieu du code qui est en fait écrit par un développeur. Je trouve que c'est une meilleure solution, bien que l'aide de @SuppressWarnings, //NOSONAR
ou désactiver les règles dans le Sonar lui-même.
voir ci-dessous un exemple pour y parvenir dans Maven. Ajoutez ceci à votre pom.xml:
<properties>
...
<!-- This is exposed as a workaround to do the sonar analysis in combination with delombok -->
<src.dir>src/main/java</src.dir>
...
</properties>
...
<plugins>
...
<plugin>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-maven-plugin</artifactId>
<version>${lombok-plugin.version}</version>
<executions>
<execution>
<phase>verify</phase>
<goals>
<goal>delombok</goal>
</goals>
<configuration>
<addOutputDirectory>false</addOutputDirectory>
<sourceDirectory>src/main/java</sourceDirectory>
</configuration>
</execution>
</executions>
</plugin>
...
</plugins>
...
<profiles>
...
<profile>
<!-- we have to use this profile to analyse code with sonar until https://jira.codehaus.org/browse/MSONAR-70 is fixed ! -->
<id>sonar</id>
<properties>
<src.dir>target/generated-sources/delombok</src.dir>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-maven-plugin</artifactId>
<version>${lombok-plugin.version}</version>
<executions>
<execution>
<phase>verify</phase>
<goals>
<goal>delombok</goal>
</goals>
<configuration>
<addOutputDirectory>true</addOutputDirectory>
<sourceDirectory>src/main/java</sourceDirectory>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>sonar-maven-plugin</artifactId>
<version>2.2</version>
</plugin>
</plugins>
</build>
</profile>
...
</profiles>
j'ai ajouter un pull request à l'appui de plus d'annotation à partir de Lombok.
Pour le binaire, veuillez visiter ici:
j'ai posé une question similaire il y a quelque temps: sonarqube 4.2 et lombok
en gros, vous ne pouvez plus le faire avec des annotations (comme @SuppressWarnings) dans le code. Au lieu de cela, vous devez configurer une exclusion de règle (globale) dans SonarQube:
Cliquez sur Paramètres -> Exclusions -> Questions et ajouter des entrées à Ignorer les Questions sur Plusieurs Critères, et entrer quelque chose comme:
Rule Key Pattern File Path Pattern
squid:S1068 **/models/**/*.java
Il rend votre code source un peu plus propre (puisque vous n'avez plus besoin de @SuppressWarnings), mais je n'aime pas l'idée de définir des règles globales, car cela peut causer d'autres problèmes.
mise à Jour:
Pour les Redondant nullcheck de valeur connue pour être non null', vous pouvez ajouter quelque chose comme suit:
Rule Key Pattern File Path Pattern
findbugs:RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE **/xxxxx.java
Et un autre qui peut (ou ne peut pas) être utile pour vous:
Rule Key Pattern File Path Pattern
common-java:InsufficientBranchCoverage **/models/**/*.java
pour les projets multi-modules, en me basant sur ce qui est mentionné dans la réponse de finrod, j'ai dû ajouter la propriété ci-dessous dans mon profil sonar pour éviter d'avoir dupliqué des violations (Sonar analysait à la fois src / main / java et target/generated-sources / delombok)
<properties>
<!-- Sonar will analyze the delombokized version of the code -->
<sonar.exclusions>src/main/java/**/*</sonar.exclusions>
</properties>