【问题标题】:osgi same class but classcastexceptionosgi 相同的类但 classcastexception
【发布时间】:2014-11-20 13:04:03
【问题描述】:

在 osgi 中遇到无法将 A 类转换为 A 类的问题。重点是此类 A 没有在任何其他包中以及它的创建位置中导出。在导出包的 pom 中提到了“!A”,所以 A 没有被导出。我们仍然得到这个问题。重新安装捆绑包虽然有效。无法重现问题,然后突然又回来了。任何想法。

该类是一个实体类并且是内部的——不在任何其他项目中

在 maven-bundle-plugin 我们有

<Private-Package>
  com.xxx.yyy.entity.*
</Private-Package>
<Export-Package>
  !com.xxx.yyy.entity.*
</Export-Package>

【问题讨论】:

  • 我们使用 java 和 camel 并在 jboss-fuse 上运行。
  • 只有类对象为==时才属于同一个类。也就是说,object1.getClass() == object2.getClass()。如果类是从完全相同的类文件加载的,对 VM 来说并不重要。
  • 你能验证出口的清单文件吗?您假设它不是基于 Maven 配置导出的,但实际上不在清单中?
  • 已签入清单。它不存在。
  • com.xxx.yyy.entity.* !com.xxx.yyy.entity.* 是以上可以和必要吗?我想如果你提到私人包,那么你不应该提到“!”在同一个包的导出包中。

标签: osgi osgi-bundle jbossfuse


【解决方案1】:

当我们使用具有字符串类缓存而没有直接连接到类包的技术时,我们遇到了类似的问题。

假设有 Bundle A 和 Bundle T(技术)。 Bundle A 已更新,但在 Bundle A 首次启动时加载的类仍在 Bundle T 的缓存中。

如果 OSGi 容器中有一项技术可以在重新启动期间更新捆绑包,这将变得非常神奇。一个典型的情况是当一项技术想要对类进行字节码操作时。它实现了一个 Bundle Weaving Hook,但它必须更新所有在神奇技术包之前启动的相关包,以便能够捕获类加载。这种神奇技术的一个例子是 Apache Aries Proxy。

顺便说一句:堆栈跟踪和一些源代码将有助于了解问题出现在哪种技术中。

【讨论】:

    猜你喜欢
    • 2016-01-26
    • 2016-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-05
    • 2012-06-30
    • 1970-01-01
    相关资源
    最近更新 更多