首页 > 解决方案 > 为什么 Findbugs JSR305 会破坏 RedHat/JBoss Fuse 6.3.0 中 javax.annotations 的 OSGi 包导出?

问题描述

我们需要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 包的导出,包括 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章 版本=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章 版本=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 导出。

标签: osgiosgi-bundlejbossfuseapache-servicemixjsr305

解决方案


我有同样的问题(是的 - 在 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 更改为 importjavax.annotation;version="[1,4)"而不是 just javax.annotation,因此 maven-bundle-plugin 不会生成 bad javax.annotation;version="[3,4)"

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


推荐阅读