当前位置: 首页 > 知识库问答 >
问题:

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

袁博
2023-03-14

我有一个OSGI应用程序,其包需要两个版本的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

Bundle Brequire-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从com.ibm.msg.client.osgi.wmq_7.0.1.5包加载该类。事实并非如此!?!??MQQueueConnectionFactory是从Bundlecom.ibm.mq.osgi.client_6.0.2.5加载的!!

因此,包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
[...]
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

包B按预期工作...

共有1个答案

齐甫
2023-03-14

如果这是一个有效的答案,请不要使用此格式,但在BUndle a version=“[7.0.1,7.0.1]”中定义依赖项时尝试使用此格式,该依赖项表示严格的版本范围。还有更糟的情况,如果您仍然有问题,您能不能通过执行platform.getBundle(“com.ibm.msg.client.osgi.wmq”).loadClass(“com.myClass”)直接从包中加载类?

 类似资料:
  • 问题内容: OSGi无法找到我的DLL文件,而且我似乎也找不到原因。 目前,我的包根目录中有DLL文件(),我也尝试将其放在目录中。 有关捆绑商品的清单看起来像这样: 然后在我的JNA界面中,执行loadLibrary(根据文档): 然后在另一个类中,我尝试使用JNA接口 我通过另一个捆绑软件提供了JNA(该捆绑软件输出com.sun.jna和上面导入的其他软件包),但也尝试过使用此处定义的捆绑软

  • 我使用EclipseIndigo使用OSGiJava框架开发了一些包。有一个主捆绑包,它依赖于其他捆绑包,并且具有要运行的主程序。如果我尝试在Eclipse中运行所有捆绑包,一切都正常工作,但是如果我将每个捆绑包保存为一个JAR,并在命令行中启动OSGi框架,当我尝试启动主捆绑包时,会出现异常<code>NoClassDefFoundError。找不到的类是依赖项。包的其余部分处于活动状态,主包刚

  • http://maven.apache.org/xsd/maven-4.0.0.xsd“>4.0.0 请建议我如何在osgi容器中添加spring-boot包

  • 我正在将我的spring-java项目转移到OSGi。 我有一些依赖项,这些依赖项在spring ebr repo或maven repo中不能作为包提供。处理它们的最佳方法是什么? null

  • 我创建了一个依赖于SLF4J的捆绑包,因此使用Logback来实现OSGI。这一切都捆绑起来并安装正常,但是当我开始捆绑时,我得到以下异常: org.osgi.framework.BundleException: 無法解析 com.felix.test [20](R 20.0): missing requirements [com.felix.test [20](R 20.0)] osgi.wir

  • 问题1:- 我正在做一个大量使用OSGi的项目。我是OSGi新手。在我的项目中,我看到了equinox和knopflerfish/and或knopflerfish束的罐子。 问题2:- 我如何在Equinox和Knoplerfish中确定OSGI在我的项目中使用哪个容器?我假设OSGI不能同时使用这两个容器。 问题3:- 这个链接提到Equinox框架需要来实现OSGI核心。那么这是否意味着它不需