gpt4 book ai didi

java - OSGi/Equinox 类加载器使用意外的捆绑版本

转载 作者:搜寻专家 更新时间:2023-11-01 03:54:34 24 4
gpt4 key购买 nike

我有一个 OSGI 应用程序,其 Bundle 需要 2 个版本的 IBM MQSeries:6.0.2 和 7.0.1。我们安装了以下 IBM MQ 包(仅提及主要包)

  • com.ibm.mq.osgi.client_6.0.2.5.jar
  • com.ibm.msg.client.osgi.wmq_7.0.1.5.jar

我们将 2 个 Bundle 定义为 Require-Bundle,如下所示(是的,我知道,我们应该使用 import-package ;-))捆绑 A Require-Bundle: com.ibm.msg.client.osgi.wmq;bundle-version="7.0.1"

Bundle B Require-Bundle: com.ibm.mq.osgi.client;bundle-version="[6.0.2,7.0.0)"

我们另外定义了org.osgi.framework.bootdelegation=javax.*。没有好友类加载,没有动态类加载。

现在,当 Bundle A 使用

加载 com.ibm.mq.jms.MQQueueConnectionFactory
final MQQueueConnectionFactory connectionFactory = new MQQueueConnectionFactory();

我希望 Equinox 从 Bundle com.ibm.msg.client.osgi.wmq_7.0.1.5 加载类。不是这种情况 !?!?? MQQueueConnectionFactory 从 Bundle com.ibm.mq.osgi.client_6.0.2.5 加载!!

因此,Bundle A 使用 MQ 6.0.2.5..

设置一些 Equinox 调试选项,我可以看到以下内容:

Bundle id 56 == com.ibm.mq.osgi.client_6.0.2.5
Bundle id 53 == com.ibm.msg.client.osgi.jms.prereq_7.0.1.5

[...]
BundleLoader[A_1.1.3].loadBundleClass(com.ibm.mq.jms.MQQueueConnectionFactory)
BundleLoader[com.ibm.mq.osgi.client_6.0.2.5].findLocalClass(com.ibm.mq.jms.MQQueueConnectionFactory)
BundleClassLoader[PATH/org.eclipse.osgi/bundles/56/1/.cp/com.ibm.mq.jar].findClassImpl(com.ibm.mq.jms.MQQueueConnectionFactory)
BundleClassLoader[PATH/org.eclipse.osgi/bundles/56/1/.cp/com.ibm.mqjms.jar].findClassImpl(com.ibm.mq.jms.MQQueueConnectionFactory)
about to read 11659 bytes from com/ibm/mq/jms/MQQueueConnectionFactory.class
read 11659 bytes from PATH/org.eclipse.osgi/bundles/56/1/.cp/com.ibm.mqjms.jar/com/ibm/mq/jms/MQQueueConnectionFactory.class
defining class com.ibm.mq.jms.MQQueueConnectionFactory
[...]

“有趣”的部分是 javax.jms.* 类是从 com.ibm.msg.client.osgi.jms.prereq_7.0.1.5

加载的
BundleClassLoader[com.ibm.mq.osgi.client_6.0.2.5].loadClass(javax.jms.QueueConnectionFactory)
BundleLoader[com.ibm.mq.osgi.client_6.0.2.5].loadBundleClass(javax.jms.QueueConnectionFactory)
BundleLoader[com.ibm.msg.client.osgi.jms.prereq_7.0.1.5].findLocalClass(javax.jms.QueueConnectionFactory)
BundleClassLoader[PATH/org.eclipse.osgi/bundles/53/1/.cp/jms.jar].findClassImpl(javax.jms.QueueConnectionFactory)
about to read 371 bytes from javax/jms/QueueConnectionFactory.class
read 371 bytes from /opt/fxportal/FXMB/application/configuration/org.eclipse.osgi/bundles/53/1/.cp/jms.jar/javax/jms/QueueConnectionFactory.class
defining class javax.jms.QueueConnectionFactory
BundleLoader[com.ibm.msg.client.osgi.jms.prereq_7.0.1.5] found local class javax.jms.QueueConnectionFactory

恕我直言,这与 org.osgi.framework.bootdelegation 设置以及 7.0.1.5 JMS 先决条件发生在 6.0.2.5 之前这一事实有关。

有人可以解释 Bundle Class Loader 的行为吗??为什么 Equinox 以这种方式连接线束 A?我怎样才能实现预期的行为??

Bundle B 正在按预期工作...

最佳答案

如果这是一个有效的答案,请不要这样做,但在 BUndle A version="[7.0.1,7.0.1]"中定义依赖项时尝试使用此格式,这表示严格的版本范围。还有更糟糕的情况,如果你仍然有问题,你可以通过执行 Platform.getBundle("com.ibm.msg.client.osgi.wmq").loadClass("com.myclass") 直接从 Bundle 加载类?

关于java - OSGi/Equinox 类加载器使用意外的捆绑版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12475168/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com