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 des Unused private field.
  • @Getter(lazy=true): quand j'utilise cette annotation j'obtiens le Redundant 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?

10
demandé sur Arturo Volpe 2014-07-31 17:06:27

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>
7
répondu finrod 2017-06-13 15:37:17

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 
1
répondu su- 2017-05-23 11:46:43

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>
0
répondu Vincent F 2017-10-05 09:29:44