为啥 Findbugs JSR305 会破坏 RedHat/JBoss Fuse 6.3.0 中 javax.annotations 的 OSGi 包导出?

Posted

技术标签:

【中文标题】为啥 Findbugs JSR305 会破坏 RedHat/JBoss Fuse 6.3.0 中 javax.annotations 的 OSGi 包导出?【英文标题】:Why does Findbugs JSR305 break OSGi package export of javax.annotations in RedHat/JBoss Fuse 6.3.0?为什么 Findbugs JSR305 会破坏 RedHat/JBoss Fuse 6.3.0 中 javax.annotations 的 OSGi 包导出? 【发布时间】:2021-02-10 13:25:28 【问题描述】:

我们需要FindBugs JSR305 作为依赖项,我们将其作为包装好的OSGi 包部署到Fuse 6.3.0。起初看起来一切都很好,组件运行良好。但重启后,许多依赖 javax.annoation API 的包不再启动。我们发现,Fuse安装自带的javax.annoation API Bundle重启后没有导出javax.annoation包。虽然 javax.annotation API 的包启动时没有错误并导出其他包。

RedHat Fuse 6.3.0.475 和相应的 Karaf 2.4.0.redhat-630475 出现此错误。

我们已经尝试过来自 Maven Repository 的 ServiceMix JSR305 Bundle,但它在 1.1.0 版本中导出了 javax.annotation,我们需要 3.0.2 版本。也许这也是一个错误,因为我希望从包版本 3.0.2_1 导出 javax.annotation 3.0.2。

Manifest-Version: 1.0
Bnd-LastModified: 1493877706145
Build-Jdk: 1.8.0_111
Built-By: jbonofre
Bundle-Description: This OSGi bundle wraps jsr305 1.1.0 jar file.
Bundle-DocURL: http://www.apache.org/
Bundle-License: http://www.apache.org/licenses/LICENSE-2.0.txt
Bundle-ManifestVersion: 2
Bundle-Name: Apache ServiceMix :: Bundles :: jsr305
Bundle-SymbolicName: org.apache.servicemix.bundles.jsr305
Bundle-Vendor: The Apache Software Foundation
Bundle-Version: 3.0.2.1
Created-By: Apache Maven Bundle Plugin
Export-Package: javax.annotation;version="1.1.0";uses:="javax.annotation.meta",javax.annotation.concurrent;version="1.1.0",javax.annotation.meta;version="1.1.0";uses:="javax.annotation"
Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.5))"
Tool: Bnd-3.2.0.201605172007

复制 设置新的 Fuse 6.3.0 安装。使用“pacakges:exports | grep javax.annoation;”您可以发现 javax.annoation 是从 System Bundle 导出的 1.0.0 版本和从 javax.annoation API 导出的 1.2.0 版本。

JBossFuse:karaf@root> packages:exports | grep javax.annotation\;
 0 javax.annotation; version=1.0.0
60 javax.annotation; version=1.2.0

现在将FindBugs JSR305 作为包装好的 OSGi 包安装到实例。 javax.annotation 包现在有 3 个导出,包括 FindBugs JSR305 包的 3.0.2 版,一切正常。

JBossFuse:karaf@root> packages:exports | grep javax.annotation\;
 0 javax.annotation; version=1.0.0
60 javax.annotation; version=1.2.0

294 javax.annotation;版本=3.0.2

现在通过管理脚本或“dev:restart”重新启动实例,在实例再次启动后,您会看到一些损坏的包,因为 javax.annoation API 停止导出 javax.annotation 包的 1.2.0 版本。

JBossFuse:karaf@root> packages:exports | grep javax.annotation\;
 0 javax.annotation; version=1.0.0

294 javax.annotation;版本=3.0.2

如果您尝试使用全新的 Fuse 7.0.0 安装(与 Karaf 4.2.0 一起运行并且仍然包含 javax.annotation API),则不会发生错误。它也适用于 Fuse 7.7.0,但不再包含 javax.annotation API,java.annotation 包仅从 Sytem Bundle 导出。

【问题讨论】:

【参考方案1】:

我遇到了同样的问题(是的 - 在 JBoss Fuse 中)。升级到 Zookeeper 3.4.14 后,我们在 mvn dependency:tree 中有这个:

[INFO] |  \- org.apache.zookeeper:zookeeper:jar:3.4.14:compile
[INFO] |     +- org.slf4j:slf4j-log4j12:jar:1.7.10:compile
[INFO] |     +- com.github.spotbugs:spotbugs-annotations:jar:3.1.9:compile
[INFO] |     |  \- com.google.code.findbugs:jsr305:jar:3.0.2:compile

Findbugs 库简直坏了:

JBossFuse:karaf@root> install mvn:com.google.code.findbugs/jsr305/3.0.2
Bundle ID: 295
JBossFuse:karaf@root> headers 295

FindBugs-jsr305 (295)
---------------------
Archiver-Version = Plexus Archiver
Created-By = Apache Maven Bundle Plugin
Manifest-Version = 1.0
Bnd-LastModified = 1490936130302
Build-Jdk = 1.8.0_101
Built-By = lan
Tool = Bnd-2.1.0.20130426-122213

Bundle-License = http://www.apache.org/licenses/LICENSE-2.0.txt
Bundle-ManifestVersion = 2
Bundle-SymbolicName = org.jsr-305
Bundle-Version = 3.0.2
Bundle-Name = FindBugs-jsr305
Bundle-Description = JSR305 Annotations for Findbugs

Export-Package = 
    javax.annotation;uses:=javax.annotation.meta;version=3.0.2,
    javax.annotation.concurrent;version=3.0.2,
    javax.annotation.meta;uses:=javax.annotation;version=3.0.2

因为它以不存在的版本导出javax.annotation 包。如果你检查JSR 250, Common Annotations for the JavaTM Platform,它的版本应该是1.3,它与Maven Central的版本匹配。

在我们的例子中,我们将 activemq-osgi 更改为导入 javax.annotation;version="[1,4)" 而不仅仅是 javax.annotation,因此 maven-bundle-plugin 不会生成错误的 javax.annotation;version="[3,4)"

但是 IMO,findbugs 根本不应该使用 javax.annotation 包...

【讨论】:

今天在将旧的 Eclipse 框架产品升级到 Eclipse 4.10.0 时遇到了这个问题。显然 org.jsr-305 JAR 被引入到我们的产品中,堵塞了 Eclipse 运行所需的注释。对我来说完全不同的情况,但你的情况让我找到了解决办法。谢谢! 只是好奇,你们是怎么解决包装问题的?您是否手动提取清单、更改它并重新打包,或者您是否知道是否有更优雅的解决方案来重新打包清单中的错误信息? @niken 我没有重新包装任何东西。我已将导入范围扩大到javax.annotation;version="[1,4)"。但是有种方法可以重新打包 - 你甚至不必更改原始工件,你可以使用wrap: 协议安装它。请参阅ops4j1.jira.com/wiki/spaces/paxurl/pages/3833898/Wrap+Protocol - 您可以使用此语法更改清单。

以上是关于为啥 Findbugs JSR305 会破坏 RedHat/JBoss Fuse 6.3.0 中 javax.annotations 的 OSGi 包导出?的主要内容,如果未能解决你的问题,请参考以下文章

错误:与依赖项“com.google.code.findbugs:jsr305”冲突

Spring 5 core 中的 @NonNull 是个什么鬼?!

JSR 305 的状态如何?

Android Studio添加依赖编译报错

为啥我在 SonarQube 上看不到 Findbugs 的错误?

工具使用冷知识