我有一個OSGI應用程序,需要2個版本的IBM MQSeries的Bundle: 6.0.2和7.0.1。 我們安裝以下IBM MQ軟件包(只是mentionning主要的)OSGi/Equinox類加載器使用意外的捆綁版本
com.ibm.mq.osgi.client_6.0.2.5.jar
com.ibm.msg.client.osgi.wmq_7.0.1.5.jar
我們定義了2個捆綁要求束如下(是的,我知道,我們應該使用進口包;-)) 捆綁Require-Bundle: com.ibm.msg.client.osgi.wmq;bundle-version="7.0.1"
捆B Require-Bundle: com.ibm.mq.osgi.client;bundle-version="[6.0.2,7.0.0)"
另外定義org.osgi.framework.bootdelegation=javax.*
。 沒有好友類加載,沒有動態類加載。
現在,當捆綁使用
final MQQueueConnectionFactory connectionFactory = new MQQueueConnectionFactory();
我希望春分從捆綁com.ibm.msg.client.osgi.wmq_7.0.1.5
加載類加載com.ibm.mq.jms.MQQueueConnectionFactory
。 這不是這種情況!?!?? MQQueueConnectionFactory從Bundle com.ibm.mq.osgi.client_6.0.2.5
加載!
至於結果,捆綁使用MQ 6.0.2.5 ..
設置一些春分調試選項,我可以看到以下內容:
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?我怎樣才能達到預期的行爲?
疊B按預期工作...