我有一個嵌入 Tomcat 的 Java 11 專案:
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>10.1.0</version>
</dependency>
Tomcat 特定的代碼在一個只有兩個類的子專案中。當我使用 Maven 3.8.6 和 Java 17 編譯時-Xlint:all,我看到該子專案的以下警告:
[WARNING] Cannot find annotation method 'value()' in type 'aQute.bnd.annotation.spi.ServiceConsumer': class file for aQute.bnd.annotation.spi.ServiceConsumer not found
進行一些搜索會發現類似(但不準確)的東西,例如Lombok Issue #2145,這暗示我可能需要添加某種額外的依賴項,例如biz.aQute.bnd:bndlibor org.osgi:osgi.annotation。但即使添加了這些依賴項,警告仍然存在。
這個錯誤來自哪里,它是什么意思?我的源代碼中沒有任何@ServiceConsumer注釋,在我擴展的 Tomcat 類中也找不到任何注釋。我怎樣才能讓它消失?
我提交了Tomcat Bug 66299。
uj5u.com熱心網友回復:
我在 Tomcat 用戶郵件串列中討論了這個問題[email protected](感謝 Mark),這就是正在發生的事情:
- Tomcat 實際上有兩個構建:
- 我稱之為 Tomcat 的“主要構建”使用 Ant with
build.xml,它編譯源檔案,創建所有 JAR 和二進制檔案,并將它們發布到 Maven Central (Nexus)。 - 第三方使用已發布的 JAR 和 POM(例如
org.apache.tomcat.embed:tomcat-embed-core:10.1.0使用 Maven)進行的任何“二次構建”。
- 我稱之為 Tomcat 的“主要構建”使用 Ant with
- 最新版本的直接依賴項可以在 Tomcat 存盤庫中找到
build.properties.default。 - 主要構建生成 JPMS 和 OSGi 元資料,因此某些類使用 bnd 注釋進行注釋
aQute.bnd.annotation.spi.ServiceConsumer。目前 Tomcat 從 中獲取此注釋biz.aQute.bnd:biz.aQute.bnd:6.3.1,這顯然是一些聚合 JAR;相同的注釋可以在較小的biz.aQute.bnd:biz.aQute.bnd.annotation:6.3.1. aQute.bnd.annotation.spi.ServiceConsumer注釋源代碼使用 OSGi注釋org.osgi.annotation.bundle.Requirement。目前這個注解可以在org.osgi:osgi.annotation:8.1.0.- bnd 和 OSGi 注釋仍然是編譯類的一部分,即使它們在運行時不使用并且在任何輔助構建中在技術上都不需要。
- 如果您想通知 Maven 以及
javac這些類的位置,以便它們不會出現缺失(如果您正在使用 的某些變體進行編譯-Xlint),但在運行時不需要它們(從技術上講,在編譯時甚至不需要在輔助構建中)并且不應在生成的 JAR 中分發,您可以使用范圍在pom.xml檔案中記錄它們。provided
<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 將在您的構建期間下載這些工件,從而消除警告,但它們不會包含在您構建的結果工件中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/513944.html
標籤:爪哇雄猫
