[JAVA] Verwenden Sie statische Analysewerkzeuge in Ihrem Gradle-Projekt

Überblick

Gradle bietet ein Standard-Plug-In für die Verwendung statischer Analysewerkzeuge. Erfahren Sie, wie Sie sie in Ihr Gradle-Projekt integrieren können.

Wenn Sie etwas falsch finden, lassen Sie es uns bitte wissen oder fordern Sie eine Bearbeitung an. : Bogen:

Artikelhintergrund

"Softwaretest aus null Wissen [überarbeitete Ausgabe]" Als ich das Buch las, fand ich plötzlich die zyklomatische Komplexität meines Projekts. Ich möchte die Komplexität messen.

: Frage: Warum Gradle

In Java hat Eclipse ein Plug-In, aber ich persönlich möchte Eclipse nur zum Schreiben von Code verwenden, und ich denke auch, dass das Gradle-Plug-In die Reproduktion der Umgebung erleichtert, so Gradle Ich fragte mich, ob es von verwendet werden könnte, und fand heraus, dass das PMD-Plug-In standardmäßig bereitgestellt wird. Es gibt ziemlich viele japanische Kommentarartikel zu diesem Plug-In, und wenn ich mich darauf beziehe, kann ich ohne Probleme messen.

: do_not_litter: Wenn Sie einen anderen vorhandenen Artikel haben, können Sie einfach den Link einfügen und müssen den Artikel nicht schreiben.

Dieses Mal werde ich vorstellen, wie man es einfach benutzt, einschließlich Plug-Ins, die andere statische Analysewerkzeuge verwenden.

Was ist statische Analyse?

Es wird gesagt, dass die Methode der Analyse ohne Ausführung des Programms so genannt wird. Bei Java analysiert das Tool den Quellcode und den Bytecode. Die automatische Ausführung durch die Maschine kann dazu beitragen, Fehler und Inkonsistenzen zu finden, die für das menschliche Auge schwer zu finden sind, zukünftige eingebettete Fehler zu verhindern und Code in gut lesbaren Code umzuschreiben.

Ausführungsumgebung

Product Version
Java SE 1.8.0_111
OS Windows 10
Gradle 3.2.1

Zielprojekt

Verwenden Sie den zuvor erstellten RatPack-Beispielcode.

Ordnerhierarchie(tree /f)


src
├─main
│  ├─java
│  │  └─jp
│  │      └─toastkid
│  │          ├─libs
│  │          │  └─tinysegmenter
│  │          │          CharacterClassifier.java
│  │          │          ScoreMap.java
│  │          │          TinySegmenter.java
│  │          │
│  │          └─ratpack
│  │              │  Main.java
│  │              │
│  │              └─models
│  │                      WordCloud.java
│  │
│  └─resources
│      │  .ratpack
│      │  wordcloud.html
│      │
│      └─public
│          ├─images
│          │      favicon.png
│          │      icon.png
│          │
│          ├─javascripts
│          │  │  jquery-1.6.4.min.js
│          │  │
│          │  ├─d3
│          │  │      d3.js
│          │  │      LICENSE(d3)
│          │  │
│          │  └─d3-cloud
│          │          d3.layout.cloud.js
│          │          index.js
│          │          LICENSE
│          │          package.json
│          │          README.md
│          │
│          └─stylesheets
│                  main.css
│
└─test
    └─java
        └─jp
            └─toastkid
                └─ratpack
                    └─models
                            WordCloudTest.java

PMD Es ist ein statisches Analysewerkzeug, das auf problematischen Code aus grundlegenden Programmierindikatoren hinweist.

Einführung

Sie können es nur verwenden, indem Sie das Hinzufügen eines Steckers angeben.

build.gradle


apply plugin: 'pmd'

Lauf

$ gradle pmdmainBitte führen Sie die.

Lauf


$ gradle pmdMain

:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:pmdMain

BUILD SUCCESSFUL

Total time: 2.938 secs

Die Berichtsdatei wird im HTML- und XML-Format in `` `build / reports / pmd``` ausgegeben.

pmd1.png

Regel hinzugefügt

Basic, das standardmäßig verwendet wird, enthält nur wenige Kontrollkästchen. Fügen wir also ein wenig hinzu. In PMD können Sie die Regeln verwenden, die unter dem folgenden Link veröffentlicht werden.

http://pmd.sourceforge.net/pmd-4.3.0/rules/index.html

Die zyklomatische Komplexität kann mit CodeSize gemessen werden. Fügen wir diesmal Klammern und CodeSize hinzu. Beachten Sie, dass bei der Angabe der Regel das Präfix `` `java-``` erforderlich war.

build.gradle


pmd {
  ruleSets = [
    'java-braces',
    'java-codesize',
  ]
}

Lauf

$ gradle pmdmainBitte führen Sie die.

Lauf


$ gradle pmdMain

:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:pmdMain FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':pmdMain'.
> 10 PMD rule violations were found. See the report at: file:///C:/Users/Toast%20kid/Documents/workspace/ratpack_word_cloud-master/build/reports/pmd/main.html

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 2.266 secs

Der Build schlug gewaltsam fehl, weil die Anzahl der Anzeigen über einem bestimmten Niveau lag.

Punkte, auf die hingewiesen werden muss

pmd2.png

project\src\main\java\jp\toastkid\libs\tinysegmenter\ScoreMap.java 	1492 	The constructor 'ScoreMap' has a Cyclomatic Complexity of 43.

Es wurde darauf hingewiesen, dass "ScoreMap.java-Konstruktoren 43 zyklomatische Komplexitäten aufweisen". Je niedriger dieser Wert ist, desto präziser ist der Code. Mehr als 20 sind vorsichtshalber und mehr als 50 sind recht komplex. Standardmäßig gibt CodeSize eine Warnung aus, wenn 10 oder mehr vorhanden sind.

Formel für die zyklomatische Komplexität

C = Anzahl der Programmrouten - Anzahl der Programmverzweigungspunkte + 2

: Warnung: Behandeln Sie Build nicht als Fehler, auch wenn zu viele Hinweise vorliegen

Das ist nicht immer gut, aber in diesem Fall können Sie `` ignoreFailures = true``` hinzufügen und der Build wird erfolgreich sein.

Zu build.gradle hinzugefügt

build.gradle


pmd {
  ignoreFailures = true
  ruleSets = [
……
}

Lauf

$ gradle pmdmainBitte führen Sie die.

Lauf


$ gradle pmdMain

:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:pmdMain
10 PMD rule violations were found. See the report at: file:///C:/Users/Toast%20kid/Documents/workspace/ratpack_word_cloud-master/build/reports/pmd/main.html

BUILD SUCCESSFUL

Total time: 2.25 secs

Referenz


FindBugs Es ist ein statisches Analysetool, das auf potenzielle Fehler im Java-Code hinweist.

Einführung

Zu build.gradle hinzufügen.

build.gradle


apply plugin: 'findbugs'

Lauf

$ gradle findbugsmainFühren Sie die Analyse mit dem Befehl aus.

Lauf


$ gradle findbugsMain

:compileJava
:processResources
:classes
:findbugsMain
Download https://repo1.maven.org/maven2/com/google/code/findbugs/findbugs/3.0.1/findbugs-3.0.1.pom

...(Unterlassung)...

Download https://repo1.maven.org/maven2/org/ow2/asm/asm/5.0.2/asm-5.0.2.jar

:findbugsMain
FindBugs rule violations were found. See the report at: projet/build/reports/findbugs/main.xml

Bericht

Das Analyseergebnis wird in XML ausgegeben. Ich möchte es in HTML sehen, konnte die Option jedoch nicht finden.

Sample


  <BugInstance type="NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE" priority="2" rank="13" abbrev="NP" category="STYLE">
    <Class classname="jp.toastkid.jfx.common.Style">
      <SourceLine classname="jp.toastkid.jfx.common.Style" start="36" end="137" sourcefile="Style.java" sourcepath="jp/toastkid/jfx/common/Style.java"/>
    </Class>
    <Method classname="jp.toastkid.jfx.common.Style" name="findJarResourceDir" signature="()Ljava/util/List;" isStatic="true">
      <SourceLine classname="jp.toastkid.jfx.common.Style" start="117" end="137" startBytecode="0" endBytecode="633" sourcefile="Style.java" sourcepath="jp/toastkid/jfx/common/Style.java"/>
    </Method>
    <LocalVariable name="?" register="-1" pc="219" role="LOCAL_VARIABLE_UNKNOWN"/>
    <SourceLine classname="jp.toastkid.jfx.common.Style" start="133" end="133" startBytecode="219" endBytecode="219" sourcefile="Style.java" sourcepath="jp/toastkid/jfx/common/Style.java" role="SOURCE_LINE_INVOKED"/>
    <SourceLine classname="jp.toastkid.jfx.common.Style" start="133" end="133" startBytecode="216" endBytecode="216" sourcefile="Style.java" sourcepath="jp/toastkid/jfx/common/Style.java" role="SOURCE_LINE_KNOWN_NULL"/>
    <Property name="edu.umd.cs.findbugs.detect.NullDerefProperty.DEREFS_ARE_CLONED" value="true"/>
  </BugInstance>

: Warnung: Behandeln Sie Build nicht als Fehler, auch wenn zu viele Hinweise vorliegen

Wenn Sie diesem Plug-In `` `ignoreFailures = true``` hinzufügen, wird der Build nicht als Fehler behandelt, unabhängig davon, wie viele Warnungen ausgegeben werden.

build.gradle


findbugs {
  ignoreFailures = true

Referenz


Checkstyle Checkstyle ist ein Tool zum Überprüfen, ob der Java-Quellcode den Codierungsstandards entspricht.

Einführung

Fügen Sie build.gradle die folgende Zeile hinzu.

build.gradle


apply plugin: 'checkstyle'

: no_entry: Ausführen (Fehler)

$ gradle checkFühren Sie die Prüfung mit aus. Wenn Sie dieses Plug-In alleine überprüfen möchten$ gradle checkstylemainEs ist möglich mit.

Lauf(Fehler)


$ gradle check

:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:checkstyleMain
Download https://repo1.maven.org/maven2/com/puppycrawl/tools/checkstyle/5.9/checkstyle-5.9.pom

……(Unterlassung)……

Download https://repo1.maven.org/maven2/com/google/guava/guava-jdk5/14.0.1/guava-jdk5-14.0.1.jar
:checkstyleMain FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':checkstyleMain'.
> Unable to create a Checker: unable to find project\config\checkstyle\checkstyle.xml

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 7.326 secs

Konfigurationsdatei hinzufügen

Wenn Sie die Prüfung mit nichts ausführen, schlägt dies wie oben beschrieben fehl. Sie müssen eine Checkstyle-Einstellungsdatei vorbereiten. Rufen Sie daher die Konfigurationsdatei, die die Regeln von Sun reproduziert aus dem Folgenden ab.

https://github.com/checkstyle/checkstyle

Fügen Sie den Ordner `config / checkstyle``` zum Stammverzeichnis Ihres Projekts hinzu und legen Sie dort die` checkstyle.xml``` ab.

: no_entry: Erneut ausführen (Fehler)

Der Befehl ist der gleiche wie zuvor.

Lauf


$ gradle check

:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:checkstyleMain FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':checkstyleMain'.
> Unable to create a Checker: Property 'fileExtensions' in module Checker does not exist, please check the documentation

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 1.782 secs

Es wird gesagt, dass fileExtensions nicht existiert.

Auskommentieren und ausführen

Kommentieren Sie das relevante Teil aus und versuchen Sie es auszuführen.

Lauf


$ gradle check

:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:checkstyleMain
[ant:checkstyle] project\src\main\java\jp\toastkid\libs\tinysegmenter\CharacterClassifier.java:0: Missing package-info.java file.
[ant:checkstyle] project\src\main\java\jp\toastkid\libs\tinysegmenter\CharacterClassifier.java:0:Die Datei endet nicht mit einer neuen Zeile.

……(Weggelassen, weil es zu viele Punkte gibt)……

[ant:checkstyle] project\src\main\java\jp\toastkid\ratpack\models\WordCloud.java:79:58: 'str'Zu@Benötigt param tag.
:checkstyleMain FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':checkstyleMain'.
> Checkstyle rule violations were found. See the report at: project/build/reports/checkstyle/main.html

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 3.639 secs

Nun, der Code, den ich dieses Mal vorbereitet habe, war wirklich schrecklich ... Selbst mit diesem Plug-In schlägt der Build fehl, wenn eine Warnung ausgegeben wird, wenn ignoreFailures falsch ist. Der Bericht wurde erstellt. Schauen wir uns das an.

Bericht

Berichtsdateien werden in HTML und XML unter `build / reports / checkstyle /` generiert.

cs.png

: Warnung: Behandeln Sie Build nicht als Fehler, auch wenn zu viele Hinweise vorliegen

Wenn Sie diesem Plug-In `` `ignoreFailures = true``` hinzufügen, wird der Build nicht als Fehler behandelt, unabhängig davon, wie viele Warnungen ausgegeben werden.

build.gradle


checkstyle {
  ignoreFailures = true

Referenz


JaCoCo Ein Plug-In, das Testberichte ausgibt. Sie können die Testabdeckung messen und visuell referenzieren. Der Name scheint das Akronim von "** Ja ** va ** Co ** de ** Co ** verage" zu sein.

Einführung

Fügen Sie das JaCoCo-Plug-In zu build.gradle hinzu.

build.gradle


apply plugin: "jacoco"

Lauf

Der Testbuild muss ausgeführt werden. Führen Sie es diesmal mit `$ gradle test jacocoTestReport `aus.

Lauf


$ gradle test jacocoTestReport

:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:compileTestJava
:processTestResources UP-TO-DATE
:testClasses
:test
:jacocoTestReport

BUILD SUCCESSFUL

Total time: 3.448 secs

Bericht

Standardmäßig werden Testberichte im HTML-Format unter `build / reports / jacoco / test / html / index.html `generiert.

packages jacoco.png

classes jacoco2.png

methods jacoco3.png

Es wird feiner in der Reihenfolge von Paketen-> Klassen-> Methoden.

Einzelheiten

jacoco4.png

Wenn Sie einen Methodennamen auswählen, zeigt ein grüner Hintergrund an, welcher Teil der Klasse aus dem Testcode aufgerufen wurde, und ein roter Hintergrund zeigt an, wo er nicht bestanden wurde. Es ist sehr leicht zu verstehen.

Referenz


JDpend Es scheint ein Werkzeug für die statische Analyse von Paket zu Paket zu sein.

Einführung

build.gradle


apply plugin: 'jdepend'

Lauf

$ gradle jdependmainLaufen Sie mit.

Lauf


$ gradle jdependMain

:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:jdependMain
Download https://repo1.maven.org/maven2/jdepend/jdepend/2.9.1/jdepend-2.9.1.pom
Download https://repo1.maven.org/maven2/org/apache/ant/ant-jdepend/1.9.6/ant-jdepend-1.9.6.pom
Download https://repo1.maven.org/maven2/org/apache/ant/ant-parent/1.9.6/ant-parent-1.9.6.pom
Download https://repo1.maven.org/maven2/jdepend/jdepend/2.9.1/jdepend-2.9.1.jar
Download https://repo1.maven.org/maven2/org/apache/ant/ant-jdepend/1.9.6/ant-jdepend-1.9.6.jar
[ant:jdependreport] ependMain

[ant:jdependreport] Unknown constant: 18

BUILD SUCCESSFUL

Total time: 3.719 secs

Bericht

Berichtsdateien werden im XML-Format in `` `build / reports / jdepend``` generiert.

Behandeln Sie Build nicht als Fehler, auch wenn es zu viele Hinweise gibt

Wenn Sie diesem Plug-In `` `ignoreFailures = true``` hinzufügen, wird der Build nicht als Fehler behandelt, unabhängig davon, wie viele Warnungen ausgegeben werden.

build.gradle


JDepend {
  ignoreFailures = true

Referenz


Projektbericht-Plug-In

Es hat nichts mit statischen Analysewerkzeugen zu tun, aber ich habe gelernt, dass es ein solches Plug-In zu geben scheint, also werde ich es versuchen.

Einführung

Fügen Sie das Plug-In zu build.gradle hinzu.

build.gradle


apply plugin: 'project-report'

Lauf

$ gradle projectreportGenerieren Sie alle Berichte mit.

Lauf


$ gradle projectReport

:dependencyReport
:htmlDependencyReport
:propertyReport
:taskReport
:projectReport

BUILD SUCCESSFUL

Total time: 1.472 secs

Bericht

build/reports/project/dependencies/root.Es wird in HTML ausgegeben. Zum Anzeigen benötigen Sie die Berechtigung zum Ausführen von JavaScript.



 ![projectReport.png](https://qiita-image-store.s3.amazonaws.com/0/102004/afbec792-774d-583f-ce7f-50f8aad62ea9.png)


 Es zeigt nicht nur Abhängigkeiten bei der Anwendungskompilierung, sondern auch Plugin-Abhängigkeiten. Wenn das Textformat gut ist, wird es in `` `build / reports / project / dependencies.txt`` `generiert, daher sollten Sie darauf verweisen.

## Referenz
 - [Kapitel 41 Projektbericht-Plugin](http://gradle.monochromeroad.com/docs/userguide/project_reports_plugin.html)

----
 [License Gradle Plugin](https://github.com/hierynomus/license-gradle-plugin)
 Es ist kein Standard-Plug-In, aber ich fand es einfach und nützlich zu installieren, also werde ich darüber schreiben. Dies ist ein Plug-In, das die Lizenz des Projekts auf die Abhängigkeit zurückführt und an den Bericht ausgibt.
 Je nach Unternehmen kann es erforderlich sein, die Lizenz vor der Verwendung der OSS-Bibliothek oder vor der Freigabe des Liefergegenstandes zu überprüfen. Wenn es jedoch schwierig ist, pom.xml nacheinander zu befolgen, sollten Sie dieses Plug-In einführen. Sie können es versuchen.

## Einführung
 [Geben Sie die Lizenzliste der Abhängigkeiten mit gradle aus](http://blog.olivinecafe.info/post/105264504040/gradle%E3%81%A7dependencies%E3%81%AE%E3%83%A9%E3%82% A4% E3% 82% BB% E3% 83% B3% E3% 82% B9% E4% B8% 80% E8% A6% A7% E3% 82% 92% E5% 87% BA% E5% 8A% 9B% Wenn Sie sich auf E3% 81% 99% E3% 82% 8B beziehen, können Sie es sofort installieren.

 Fügen Sie build.gradle Folgendes hinzu, und Sie können loslegen.


#### **`build.gradle`**
```groovy

apply plugin: "com.github.hierynomus.license"

......

buildscript {
  repositories {
    maven {
      url "https://plugins.gradle.org/m2/"
    }
  }
  dependencies {
    classpath "gradle.plugin.nl.javadude.gradle.plugins:license-gradle-plugin:0.13.1"
  }
}

Lauf

$ gradle downloadlicensesBitte führen Sie die.

Lauf


$ gradle downloadLicenses

:downloadLicenses

BUILD SUCCESSFUL

Total time: 10.753 secs

Bericht

build/reports/license/Im Ordner werden zwei Arten von HTML und XML für insgesamt vier Dateien generiert.

Dateiname Erläuterung
license-dependency Zusammenfassung nach Lizenz
dependency-license Zusammenfassung nach Abhängigkeitseinheiten

license-dependency license2.png

dependency-license license1.png

`Lizenzabhängigkeit``` ist nützlich, um nach GPL-basierten Lizenzen zu suchen, und` Abhängigkeitslizenz``` wird empfohlen, wenn Sie nach einzelnen Lizenzen suchen müssen. ..

Referenz


Zusammenfassung

Ich habe die Verwendung eines statischen Analysetools vorgestellt, das einfach über das Gradle-Plug-In verwendet werden kann. Es ist wichtig, dass diese Tools automatisch regelmäßig über CI ausgeführt werden, anstatt jedes Mal durch Eingabe von Befehlen ausgeführt zu werden.

Stichprobe

Die Ordnerhierarchie des diesmal generierten Berichts

Ordnerhierarchie(tree&nbsp;/f)


build
  │
  └─reports
      ├─jacoco
      │  └─test
      │      └─html
      │          │  index.html
      │          │  jacoco-sessions.html
      │          │
      │          ├─jacoco-resources
      │          │      branchfc.gif
      │          │      branchnc.gif
      │          │      branchpc.gif
      │          │      bundle.gif
      │          │      class.gif
      │          │      down.gif
      │          │      greenbar.gif
      │          │      group.gif
      │          │      method.gif
      │          │      package.gif
      │          │      prettify.css
      │          │      prettify.js
      │          │      redbar.gif
      │          │      report.css
      │          │      report.gif
      │          │      session.gif
      │          │      sort.gif
      │          │      sort.js
      │          │      source.gif
      │          │      up.gif
      │          │
      │          ├─jp.toastkid.libs.tinysegmenter
      │          │      CharacterClassifier.html
      │          │      CharacterClassifier.java.html
      │          │      index.html
      │          │      index.source.html
      │          │      ScoreMap.html
      │          │      ScoreMap.java.html
      │          │      TinySegmenter.html
      │          │      TinySegmenter.java.html
      │          │
      │          ├─jp.toastkid.ratpack
      │          │      index.html
      │          │      index.source.html
      │          │      Main.html
      │          │      Main.java.html
      │          │
      │          └─jp.toastkid.ratpack.models
      │                  index.html
      │                  index.source.html
      │                  WordCloud.html
      │                  WordCloud.java.html
      │
      ├─license
      │      dependency-license.html
      │      dependency-license.xml
      │      license-dependency.html
      │      license-dependency.xml
      │
      ├─pmd
      │      main.html
      │      main.xml
      │
      ├─project
      │  │  dependencies.txt
      │  │  properties.txt
      │  │  tasks.txt
      │  │
      │  └─dependencies
      │      │  index.html
      │      │  root.html
      │      │  root.js
      │      │
      │      ├─css
      │      │      base-style.css
      │      │      style.css
      │      │      tree.css
      │      │
      │      ├─images
      │      │      d.gif
      │      │      d.png
      │      │      throbber.gif
      │      │
      │      └─js
      │              jquery.jstree.js
      │              jquery.min-1.11.0.js
      │              script.js
      │
      └─tests
          └─test
              │  index.html
              │
              ├─classes
              │      jp.toastkid.ratpack.models.WordCloudTest.html
              │
              ├─css
              │      base-style.css
              │      style.css
              │
              ├─js
              │      report.js
              │
              └─packages
                      jp.toastkid.ratpack.models.html

Recommended Posts

Verwenden Sie statische Analysewerkzeuge in Ihrem Gradle-Projekt
Führen Sie eine statische Code-Analyse mit Checkstyle mit Java + Gradle durch
Statische Analyse ausführen In der Windows-Umgebung ableiten
Führen Sie modulare Projekttests in Gradle aus (JUnit5 + TestFX).
Java-Tipps - Erstellen Sie mit Gradle ein Spring Boot-Projekt
Fügen Sie mit Gradle ein Projekt in einen beliebigen Ordner ein
Zeigen Sie die Gradle-Aufgabe im Spring Boot-Projekt an
Fügen Sie eine externe JAR-Datei in ein IntelliJ-Projekt ein.