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 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 导出。
解决方案
我有同样的问题(是的 - 在 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
包......
推荐阅读
- php - 如何在不修改它们的情况下获取所有 CRUD Mysql 查询的 ID?
- c++ - 递归回调:第一个回调禁用以下回调
- design-patterns - 什么设计模式最合适
- powershell - Powershell“系统找不到指定的路径”-最小示例
- java - GridBagLayout 没有按预期出现
- c# - 如何卸载统一的 WebGL
- r - 如何允许递归函数检查先前处理的字符串
- xamarin.forms - ResourceCulture System.IO.FileNotFoundException:图像 Xamarin 表单无效
- java - 是否可以在另一个jsp(应用程序B)中访问一个jsp(应用程序A)的变量
- json - 杰克逊无法序列化我的领域对象