[FIXED] Die Anmerkungsmethode „value()“ im Typ „aQute.bnd.annotation.spi.ServiceConsumer“ kann mit Tomcat nicht gefunden werden

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:allich 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:bndlibor 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 @ServiceConsumerAnmerkung 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:

    1. 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.
    2. 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.0mit Maven.
  • 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 von biz.aQute.bnd:biz.aQute.bnd:6.3.1, was anscheinend ein aggregiertes JAR ist; die gleiche Anmerkung findet sich im kleineren biz.aQute.bnd:biz.aQute.bnd.annotation:6.3.1.
  • Der aQute.bnd.annotation.spi.ServiceConsumerAnnotationsquellcode verwendet die OSGi-Annotation org.osgi.annotation.bundle.Requirement. Derzeit befindet sich diese Anmerkung in org.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, javacwo 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 Ihrer pom.xmlDatei mit dem providedGeltungsbereich 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)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like