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

为什么Findbugs JSR305会破坏RedHat/JBoss Fuse 6.3.0中javax.annotations的OSGi包导出?,osgi,osgi-bundle,jbossfuse,apache-servicemix,jsr305,Osgi,Osgi Bundle,Jbossfuse,Apache Servicemix,Jsr305,我们需要将其作为依赖项,并将其作为包装的OSGi捆绑包部署到。起初看起来一切正常,组件工作正常。但重启后,许多依赖javax.annoation API的捆绑包不再启动。我们发现,Fuse安装附带的javax.annoation API包在重启后不会导出包javax.annoation。尽管javax.annotation API包启动时没有错误,并导出其他包 RedHat保险丝6.3.0.475和相应的Karaf 2.4.0.RedHat-630475出现错误 我们已经尝试了Maven存储库中

我们需要将其作为依赖项,并将其作为包装的OSGi捆绑包部署到。起初看起来一切正常,组件工作正常。但重启后,许多依赖javax.annoation API的捆绑包不再启动。我们发现,Fuse安装附带的javax.annoation API包在重启后不会导出包javax.annoation。尽管javax.annotation API包启动时没有错误,并导出其他包

RedHat保险丝6.3.0.475和相应的Karaf 2.4.0.RedHat-630475出现错误

我们已经尝试了Maven存储库中的javax.annotation,但是它在版本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
复制
安装新的保险丝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
现在作为包装的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 javax.annotation;版本=3.0.2

现在通过管理脚本或“dev:restart”重新启动实例,在实例再次启动后,您将看到一些损坏的捆绑包,因为javax.annotation 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包仅从系统包导出。

我也遇到了同样的问题(是的,在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
包。如果选中,则其版本应为1.3,并与中的版本相匹配

在本例中,我们将activemq osgi更改为导入
javax.annotation;version=“[1,4]”
而不仅仅是
javax.annotation
,因此maven bundle插件没有生成坏的
javax.annotation;version=“[3,4]”


但是在我看来,findbugs根本不应该使用
javax.annotation
package…

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