I have a Java 11 project embedding Tomcat:
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>10.1.0</version>
</dependency>
The Tomcat-specific code is in a subproject with only two classes. When I compile using Maven 3.8.6 and Java 17 using -Xlint:all
, I see the following warning for that subproject:
[WARNING] Cannot find annotation method 'value()' in type 'aQute.bnd.annotation.spi.ServiceConsumer': class file for aQute.bnd.annotation.spi.ServiceConsumer not found
Doing a bit of searching brings up similar (but not exact) things, such as Lombok Issue #2145, which hints that I may need to add some sort of extra dependency such as biz.aQute.bnd:bndlib
or org.osgi:osgi.annotation
. But even after adding those dependencies, the warning remains.
Where is this error coming from, and what does it mean? I don't have any @ServiceConsumer
annotation in my source code, and I couldn't find any in the Tomcat classes I'm extending, either. How can I make it go away?
I filed Tomcat Bug 66299.
CodePudding user response:
I discussed this on the Tomcat users mailing list [email protected]
(thanks Mark), and here's what is happening:
- Tomcat effectively has two builds:
- What I call the Tomcat "primary build" uses Ant with
build.xml
, which compiles the source files, creates all the JARs and binaries, and publishes them to Maven Central (Nexus). - Any "secondary build" by third parties using the published JARs and POMs, using e.g.
org.apache.tomcat.embed:tomcat-embed-core:10.1.0
with Maven.
- What I call the Tomcat "primary build" uses Ant with
- The latest versions of direct dependencies are found in the Tomcat repository inside
build.properties.default
. - The primary build generates JPMS and OSGi metadata, so some classes are annotated with the bnd annotation
aQute.bnd.annotation.spi.ServiceConsumer
. Currently Tomcat gets this annotation frombiz.aQute.bnd:biz.aQute.bnd:6.3.1
, which is apparently some aggregate JAR; the same annotation can be found in the smallerbiz.aQute.bnd:biz.aQute.bnd.annotation:6.3.1
. - The
aQute.bnd.annotation.spi.ServiceConsumer
annotation source code uses the OSGi annotationorg.osgi.annotation.bundle.Requirement
. Currently this annotation can be found inorg.osgi:osgi.annotation:8.1.0
. - The bnd and OSGi annotations remain part of the compiled classes even though they are not used at runtime and are not technically needed in any secondary builds.
- If you want to inform Maven and
javac
where these classes are so that they will not appear missing (if you are compiling with some variations of-Xlint
), but that they nevertheless will not be needed at runtime (and technically aren't even needed at compile time in a secondary build) and should not be distributed in the resulting JAR, you can note them in yourpom.xml
file using theprovided
scope.
<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 will download these artifacts during your build thereby removing the warning, but they will not be included in the resulting artifacts of your build.