[JAVA] Informieren Sie sich über annotationProcessor für Gradle 5.0

Veraltete Warnung

Bei Verwendung der Anmerkungsverarbeitung in Gradle (meine Umgebung ist 4.10.2) wird die folgende Meldung angezeigt.

> gradle compileJava
...

Deprecated Gradle features were used in this build, making it incompatible with Gradle 5.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/4.10.2/userguide/command_line_interface.html#sec:command_line_warnings

Ich verwende eine Funktion, die nicht mit Gradle 5.0 kompatibel ist. Wenn Sie also weitere Details anzeigen möchten, geben Sie die Option "--warning-mode all" an.

Bei Ausführung mit den angegebenen Optionen lautet die Ausgabe wie folgt.

> gradle compileJava --warning-mode all
...

Detecting annotation processors on the compile classpath has been deprecated.
Gradle 5.0 will ignore annotation processors on the compile classpath.
The following annotation processors were detected on the compile classpath: 
'combined.apt.CombinedProcessor' and 
'separated.apt.SeparatedProcessor'. 
Please add them to the annotation processor path instead.
If you did not intend to use annotation processors, you can use the '-proc:none' compiler argument to ignore them.

Es scheint, dass Gradle 5.0 die Methode zum Abrufen des Annotationsprozessors aus dem Klassenpfad zur Kompilierungszeit nicht mehr unterstützt. Als ich es mit RC-Version 5.0 versuchte, wurde es sicherlich ignoriert.

Geben Sie es stattdessen unter "Annotation Processor Path" an. Wenn das Projekt die Anmerkungsverarbeitung nicht separat verwendet, fügen Sie der Kompilierungsoption "-proc: none" hinzu.

Gradle 5.0: Planned behaviour of ignoring jars with annotation processors not okay. · Issue #5056 · gradle/gradle

Laut den Kommentaren in dieser Ausgabe scheint der Grund darin zu liegen, inkrementelle Annotationsprozessoren zu unterstützen (ich bin mir nicht sicher).

Wie soll man antworten

Convenient declaration of annotation processor dependencies | Gradle 4.6 Release Notes

Ab Gradle 4.6 können Sie bei der Installation eines Java-Plug-Ins eine Konfiguration mit dem Namen "annotationProcessor" festlegen.

Dependency configurations | The Java Plugin

Abhängige Bibliotheken, die eine Annotationsverarbeitung bereitstellen, können in "annotationProcessor" anstelle von "Implementation" angegeben werden.

Übrigens ist "annotationProcessor" die Konfiguration für den Hauptcode. Wenn Sie also die Annotationsverarbeitung auf den Testcode anwenden möchten, geben Sie sie in "testAnnotationProcessor" an.

** Android AnnotationProcessor **

Als ich googelte, [Die Geschichte der Migration zum Android Plugin für Gradle 3.0.0](https://developer.android.com/studio/build/gradle-plugin-3-0-0-migration?hl=ja# annotationProcessor_config) zeigt auch "annotationProcessor" an, aber ist das etwas anderes? (Nicht vertraut mit Android Umständen)

Zumindest enthält das JavaPlugin von Gradle "annotationProcessor" [wie ein Commit am 15. Dezember 2017](https://github.com/gradle/gradle/commit/f71d8d69a1f1e031d6ffd105664da0ce9440f04b#diff-83f0eaa4ff604af6. Für Android ist die Veröffentlichung von 3.0.0 Oktober 2017, daher steht Android an erster Stelle. ??

Die Korrespondenzmethode ändert sich abhängig von der Methode zur Bereitstellung der Anmerkungsverarbeitung (glaube ich).

Ich habe tatsächlich verschiedene Dinge ausprobiert und festgestellt, aber selbst wenn es sich nur um die Verarbeitung von Anmerkungen handelt, denke ich, dass sich die Spezifikationsmethode je nach Bereitstellungsmethode ein wenig ändern wird (dies ist eine Schlussfolgerung, die aufgrund persönlicher Versuche und Irrtümer gezogen wurde, also Garantie für die Richtigkeit Geschichte).

Wenn klassifiziert, habe ich das Gefühl, dass sie wie folgt aufgeteilt sind.

Implementierung zur Überprüfung

Ordnerstruktur


|-build.gradle
|-settings.gradle
|-combined/
| `-src/main/
|   |-java/
|   | `-combined/
|   |   |-apt/
|   |   | `-CombinedProcessor.java
|   |   `-core/
|   |     `-Combined.java
|   `-resources/
|     `-META-INF/services/
|       `-javax.annotation.processing.Processor
|
|-separated/
| |-apt/
| | `src/main/
| |  |-java/
| |  | `-separated/apt/
| |  |   `-SeparatedProcessor.java
| |  `-resources/
| |    `-META-INF/services/
| |      `-javax.annotation.processing.Processor
| `-core/
|   `-src/main/java/
|     `-separated/core/
|       `-Separated.java
|
`-main/
  `-src/
    |-main/java/
    | `-main/
    |   `-Foo.java
    `-test/java/
      `-main/
        `-FooTest.java

―― Besteht aus 3 Multiprojekten - combined

Foo.java


package main;

import combined.core.Combined;
import separated.core.Separated;

@Combined
@Separated
public class Foo {}

--build.gradle sieht so aus

build.gradle


subprojects {
    apply plugin: "java"
    sourceCompatibility = 11
    targetCompatibility = 11
    compileJava.options.encoding = "UTF-8"
}

project(":separated:apt") {
    dependencies {
        implementation project(":separated:core")
    }
}

project(":main") {
    dependencies {
        ... //Die Einstellungen hier werden später beschrieben.
    }
}

Bibliothekskörper und Anmerkungsverarbeitung werden in separaten Gläsern bereitgestellt

In diesem Fall geben Sie die JAR des Hauptteils in "Implementierung" [^ 1] und die JAR für die Annotationsverarbeitung in "AnnotationProcessor" an.

[^ 1]: Für Bibliotheken, die nur zur Kompilierungszeit benötigt werden, auf "compileOnly" setzen

build.gradle


project(":main") {
    dependencies {
        implementation project(":separated:core")
        annotationProcessor project(":separated:apt")
    }
}

Überprüfung


> gradle :main:build --warning-mode all
...

> Task :main:compileJava
Hinweis:SeparatedProcessor!!
Hinweis:SeparatedProcessor!!

BUILD SUCCESSFUL in 4s

Ohne Vorwarnung abschließen.

Die Bibliothek, die diesem Muster entspricht, ist Dolch, der im offiziellen Dokument eingeführt wurde.

Die Bibliothek selbst und die Verarbeitung von Anmerkungen befinden sich im selben Glas

Geben Sie in diesem Fall die gleiche Abhängigkeit für "Implementierung" und "AnnotationProcessor" an.

build.gradle


project(":main") {
    dependencies {
        implementation project(":combined")
        annotationProcessor project(":combined")

        ...
    }
}

Ausführungsergebnis


> gradle :main:build --warning-mode all
...

> Task :main:compileJava
Hinweis:CombinedProcessor!!
Hinweis:SeparatedProcessor!!
Hinweis:CombinedProcessor!!
Hinweis:SeparatedProcessor!!

> Task :main:compileTestJava
Detecting annotation processors on the compile classpath has been deprecated. Gradle 5.0 will ignore annotation processors on the compile cl
asspath. The following annotation processors were detected on the compile classpath: 'combined.apt.CombinedProcessor'.  Please add them to t
he annotation processor path instead. If you did not intend to use annotation processors, you can use the '-proc:none' compiler argument to
ignore them.

BUILD SUCCESSFUL in 4s

Ich habe eine Warnung bekommen. Wenn Sie genau hinschauen, wird eine Warnung in der Aufgabe "compileTestJava" gedruckt ("compileJava" wird ohne Warnung abgeschlossen).

Die Java Plugin-Dokumentation (https://docs.gradle.org/4.10.2/userguide/java_plugin.html#tab:configurations) veranschaulicht die Abhängigkeiten jeder Konfiguration. Diesmal werden nur die relevanten Teile extrahiert (rot ist die veraltete Konfiguration).

annotationProcessor.jpg

Die in "Implementierung" angegebene Abhängigkeit wird auch in "testCompileClasspath" verwendet. Daher scheint es, dass der Annotationsprozess während des Tests aus dem Klassenpfad erkannt und eine Warnung ausgegeben wird.

Was soll ich machen?

Bei Bedarf nur zur Kompilierungszeit

Wenn Sie das JAR nur zur Kompilierungszeit benötigen, können Sie die Warnung vermeiden, indem Sie "compileOnly" anstelle von "Implementation" verwenden (oder besser gesagt, ich denke, das ist die richtige Einstellung). Zum Beispiel Lombok.

build.gradle


dependencies {
    compileOnly project(":combined")
    annotationProcessor project(":combined")

    ...
}

Ausführungsergebnis


> gradle :main:build --warning-mode all
...

> Task :main:compileJava
Hinweis:CombinedProcessor!!
Hinweis:SeparatedProcessor!!
Hinweis:CombinedProcessor!!
Hinweis:SeparatedProcessor!!

BUILD SUCCESSFUL in 5s

Keine Warnungen mehr.

ignorieren

Wenn Ihr Testcode keine Anmerkungsverarbeitung verwendet, kann das Ignorieren der Warnung eine Option sein. Wenn es von 5.0 ignoriert wird, gibt es keine Warnung, wenn es auf 5.0 angehoben wird, und ich habe das Gefühl, dass es sich in einem Zustand niederschlägt, in dem es keine Bewegungsprobleme gibt.

Als ich es mit der RC-Version 5.0 versuchte, verschwand die Warnung und nur der Hauptanmerkungsprozess funktionierte.

5.Ergebnis des Laufens mit 0RC


> gradle --version
------------------------------------------------------------
Gradle 5.0-rc-1
------------------------------------------------------------

...

> gradle :main:build
...

> Task :main:compileJava
Hinweis:CombinedProcessor!!
Hinweis:SeparatedProcessor!!
Hinweis:CombinedProcessor!!
Hinweis:SeparatedProcessor!!

BUILD SUCCESSFUL in 4s

Bei Bedarf zur Laufzeit

Die compileOnly-Spezifikation ist nicht verfügbar, wenn zur Laufzeit noch eine Abhängigkeit erforderlich ist. Dies entspricht beispielsweise Doma2.

In diesem Fall ist es meiner Meinung nach am besten, die Warnungen im Testcode zu ignorieren. Wenn es jedoch nicht ignoriert werden kann, wird meiner Meinung nach die Methode zum Hinzufügen der Spezifikation zum Deaktivieren des Anmerkungsprozessors zur Kompilierungsoption in der ersten Warnmeldung übernommen.

build.gradle


dependencies {
    implementation project(":combined")
    annotationProcessor project(":combined")

    ...
}

compileTestJava {
    //Für Testkompilierungsoptionen`-proc:none`Hinzufügen
    options.compilerArgs += ["-proc:none"]
}

Ausführungsergebnis


> gradle :main:build --warning-mode all
...

> Task :main:compileJava
Hinweis:CombinedProcessor!!
Hinweis:SeparatedProcessor!!
Hinweis:CombinedProcessor!!
Hinweis:SeparatedProcessor!!

BUILD SUCCESSFUL in 5s

Es gibt keine Warnung.

Recommended Posts

Informieren Sie sich über annotationProcessor für Gradle 5.0
Informieren Sie sich über Docker
Einführung in Kotlin für iOS-Entwickler ③-About gradle
Über für Anweisung und wenn Anweisung
[Gradle] Informationen zu Java-Plug-In-Aufgaben
Gradle-Einstellungen für die Verwendung von JUnit 5
Gradle TIPS-Sammlung (für mich)
Informationen zum Popover-Fix für iOS 13
[Durchsuchen] Achten Sie auf ransackable_scopes!