微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决为什么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捆绑包在重启后不会导出包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;”;您可以发现从System Bundle的1.0.0版本和从javax.annoation API的1.2.0版本中导出了javax.annoation。

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捆绑软件安装到实例。现在有3个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.annoation API停止了导出javax.annotation软件包的1.2.0版本。 / p>

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中导出。

解决方法

我遇到了同样的问题(是的-在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

因为它导出了{em>不存在的版本的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,findbug根本不应该使用javax.annotation包...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?