2011-11-22 24 views
3

我們使用基於Equinox的OSGI框架來運行Multiple bundle。
我們的bundle在Bundle-classpath中有依賴的JAR,並且依賴的JAR與其餘的類和資源一起打包在單個JAR/WAR文件中。 但是我們在運行多個這樣的Bundle時遇到了問題。
說,
捆綁A:完全測試/工作JAR捆綁。包含bundle classpath中的所有依賴JAR以及所有依賴JAR(位於名爲lib的文件夾下)。當通過部署僅此束即使所需的JAR位於Bundle-classpath中,OSGI類也不可見

捆B測試工作的罰款:類似於捆綁A.再次單獨部署

但是,當這兩個束被加載時一起工作,OSGI不能從在所提到的JAR加載類第二次加載的捆綁包的bundle-classpath。首先加載的bundle運行正常,而加載的bundle則失敗。

當SPRING嘗試加載javax.persistence.QueryHint類時,會出現此問題。 (在束相同的JAR)

  • 春:3.0.6.RELEASE

    我們用我們的XXXX-EntityManager.xml我們創造我們使用entityManagerFactory

    相關的JAR創建數據源JARS

  • 休眠:3.6.7 JARS
  • 休眠-JPA:休眠-JPA-2.0-API-1.0.1.Final.jar

例外: PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'targetDataSources' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [xxxx-EntityManager.xml]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: interface javax.persistence.QueryHint is not visible from class loader at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:102) at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:58) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1358)

注:

  • 無論是捆綁單獨檢測,並工作正常
  • 我們知道,而不是創建捆綁-classpath中,我們可以提取外部的第三方JAR文件捆綁並使用導入包。但是對於這個當前的需求,我們只需要父包中的第三方JAR。

要求OSGI專家請幫助我們。

+0

我覺得下面的答案已經跳起來了,我們首先需要更多的信息。它*應該*可以創建兩個捆綁包,因此它們完全隔離並單獨工作。我想知道在* working *包中加載了哪個'javax.persistence'包。 –

回答

3

我建議將您的依賴關係放入單個捆綁包中,並使所有包對其他捆綁包可見。然後添加這些單獨的捆綁包作爲依賴項(或更好的:只導入所需的包而不是整個捆綁包!)。通過這種方式,您可以確保您的依賴關係只加載一次。我建議你當前的配置導致類加載問題,因爲類加載兩次,最有可能是相同的serialVersionUID。由於每個bundle都有自己的類加載器,所以第二個(未)加載的類將不會被第二個bundle看到。

+0

感謝您的意見。是的,我們也有計劃做到這一點。但根據我們的要求,我們將爲此發行版提供大型自給自備的bundle(使用bundle-classpath),併爲即將發佈的bundle提供更精細的bundle(使用import-package)。如果我們可以使捆綁包A和B像今天一樣工作,將會很有幫助。 – Srivatsan

+0

如果@Tassos Bassoukos建議的解決方案不適合,恐怕沒有辦法解決。無論如何,不​​建議在OSGi環境中使用類路徑。我很確定已經有OSGi捆綁版本的JAR使用,所以這一步很小。此外,OSGi的概念恰恰與大型交付物相反。 – thobens

+0

我不同意,它*應該*可以創建這兩個捆綁包,以便它們封裝所有必需的功能,並且可以獨立使用(儘管我同意它不是最佳的)。還有其他的事情正在發生,我們需要深入其中。 –

0

如果無法將JAR打包爲單獨的包,請指定使用A或B來包含所有JAR,導出所有包,並使其他包依賴於它(並從第二包中除去JAR)。

+0

這可能對我們不適用。我們有一個要求,每個這些捆綁包A/B應該在同一個OSGI虛擬機中獨立並且一起工作。所以,我們不能從任何一個bundle中排除這些庫,只依賴於import-package。 – Srivatsan

+1

然後,你沒有一個划槳的諺語小溪,因爲本地捆綁類路徑將優先於進口;因爲您將有兩組相同的類,您將在兩個類加載器中加載相同的類,並且這些類彼此不兼容。 –

相關問題