Ausgabe
Ich habe ein Java 11-Projekt, in das Tomcat eingebettet ist:
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>10.1.0</version>
</dependency>
Der Tomcat-spezifische Code befindet sich in einem Unterprojekt mit nur zwei Klassen. Wenn ich mit Maven 3.8.6 und Java 17 mit kompiliere, sehe -Xlint:all
ich die folgende Warnung für dieses Unterprojekt:
[WARNING] Cannot find annotation method 'value()' in type 'aQute.bnd.annotation.spi.ServiceConsumer': class file for aQute.bnd.annotation.spi.ServiceConsumer not found
Wenn ich ein wenig suche, werden ähnliche (aber nicht exakte) Dinge angezeigt, z. B. Lombok Issue #2145 , was darauf hinweist, dass ich möglicherweise eine Art zusätzliche Abhängigkeit hinzufügen muss, z. B. biz.aQute.bnd:bndlib
or org.osgi:osgi.annotation
. Aber auch nach dem Hinzufügen dieser Abhängigkeiten bleibt die Warnung bestehen.
Woher kommt dieser Fehler und was bedeutet er? Ich habe keine @ServiceConsumer
Anmerkung in meinem Quellcode, und ich konnte auch keine in den Tomcat-Klassen finden, die ich erweitere. Wie kann ich es verschwinden lassen?
Ich habe Tomcat Bug 66299 eingereicht .
Lösung
Ich habe dies auf der Tomcat-Benutzer-Mailingliste besprochen [email protected]
(danke Mark), und hier ist, was passiert:
- Tomcat hat effektiv zwei Builds:
- Was ich den Tomcat “Primary Build” nenne, verwendet Ant mit
build.xml
, das die Quelldateien kompiliert, alle JARs und Binärdateien erstellt und sie in Maven Central (Nexus) veröffentlicht. - Jeder “sekundäre Build” durch Dritte, der die veröffentlichten JARs und POMs verwendet, z. B.
org.apache.tomcat.embed:tomcat-embed-core:10.1.0
mit Maven.
- Was ich den Tomcat “Primary Build” nenne, verwendet Ant mit
- Die neuesten Versionen direkter Abhängigkeiten finden Sie im Tomcat-Repository in
build.properties.default
. - Der primäre Build generiert JPMS- und OSGi-Metadaten, daher sind einige Klassen mit der bnd-Annotation versehen
aQute.bnd.annotation.spi.ServiceConsumer
. Momentan erhält Tomcat diese Anmerkung vonbiz.aQute.bnd:biz.aQute.bnd:6.3.1
, was anscheinend ein aggregiertes JAR ist; die gleiche Anmerkung findet sich im kleinerenbiz.aQute.bnd:biz.aQute.bnd.annotation:6.3.1
. - Der
aQute.bnd.annotation.spi.ServiceConsumer
Annotationsquellcode verwendet die OSGi-Annotationorg.osgi.annotation.bundle.Requirement
. Derzeit befindet sich diese Anmerkung inorg.osgi:osgi.annotation:8.1.0
. - Die bnd- und OSGi-Annotationen bleiben Teil der kompilierten Klassen, obwohl sie nicht zur Laufzeit verwendet werden und in sekundären Builds technisch nicht erforderlich sind.
- Wenn Sie Maven darüber informieren möchten,
javac
wo sich diese Klassen befinden, damit sie nicht als fehlend erscheinen (wenn Sie mit einigen Variationen von kompilieren-Xlint
), sie aber dennoch zur Laufzeit nicht benötigt werden (und technisch nicht einmal zur Kompilierzeit benötigt werden in einem sekundären Build) und nicht im resultierenden JAR verteilt werden sollen, können Sie sie in Ihrerpom.xml
Datei mit demprovided
Geltungsbereich vermerken.
<dependency>
<groupId>biz.aQute.bnd</groupId>
<artifactId>biz.aQute.bnd.annotation</artifactId>
<version>6.3.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.osgi</groupId>
<artifactId>osgi.annotation</artifactId>
<version>8.1.0</version>
<scope>provided</scope>
</dependency>
Maven lädt diese Artefakte während Ihres Builds herunter, wodurch die Warnung entfernt wird, aber sie werden nicht in die resultierenden Artefakte Ihres Builds aufgenommen.
Beantwortet von – Garret Wilson
Antwort geprüft von – Timothy Miller (FixError Admin)