2012-09-18 79 views
4

我有一個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按預期工作...

回答

0

定義使用捆綁的依賴時,A版=這種格式不,如果這是一個有效的答案,但嘗試「[7.0.1,7.0.1 ]「表示嚴格的版本範圍。如果你仍然遇到問題,最糟糕的情況是,你可以通過使用Platform.getBundle(「com.ibm.msg.client.osgi.wmq」)。loadClass(「com.myclass」)直接從Bundle中加載類?

0

當我在IDE中使用與OSGi相關的編碼時,我遇到了類似的情況。由IDE完成的這種佈線是錯誤的。它連接從com.ibm.mq.osgi.client_6.0.2.5類,而你期望它連線相同的類com.ibm.msg.client.osgi.wmq_7.0.1.5。在你提到的第二個問題中發生同樣的問題。你可以通過在IDE中使用它找到com.ibm.mq.jms.MQQueueConnectionFactory類來檢查它。 (您可以使用Ctrl +鼠標點擊來查看連接哪個版本)。