2011-03-29 43 views
0

我試圖使用部署耳朵與webapp,使用osgi包並導出一些類。這是在一個應用服務器。 該bundle導出從類B派生的類A. ClassB實際上是該包已決定提供的第三方開源類。問題是我的耳朵在耳朵的lib目錄中還有另一個classB版本。osgi包導出類,但仍然在類路徑被拾起

在嘗試部署應用程序時,出現了一個奇怪的錯誤,類A是從osgi bundle jar中加載的,但是因爲classB是從ear的lib目錄加載的,而不是從osgi bundle加載,即使它在那裏。

這是由於classA期望某些行爲存在於其基類中而導致的錯誤,但實際上並不存在,因爲classB是在bundle外部加載的。

我不知道如何解決這個問題 - 這是我第一次遇到osgi,我有點擔心這可能比classpath地獄更糟,特別是對於需要與osgi部分集成的應用程序以及部分它不是。

回答

0

我知道人們正在嘗試混合Java EE和OSGi堆棧,但我認爲這是一個問題的處方。他們對於類加載器如何工作以及讓他們合作可能會成爲問題都有他們自己的期望。

如果您必須這樣做,您可以儘可能地將您的web應用程序放入osgi容器中,讓自己的生活更輕鬆。或者,找到osgi運行時被初始化的地方,並改變它的父類的類加載器的連接方式。你甚至可以編寫一個自定義的過濾類加載器來防止某些類被OSGi從webapp classloader加載。許多事情都是可能的,但也許你並不是真的想走下去......

+0

哇,這很快!謝謝。我沒有選擇 - 這個東西試圖嫁給appserver,我們必須使用一個大框架thingie和osgi。我只是想了解osgi如何與常規類路徑一起工作。 – treefrog 2011-03-29 22:58:28

+0

我不認爲我明白osgi運行時是如何在耳內開始的......這是felix – treefrog 2011-03-29 23:00:04

+0

我無法回答你的問題的部分...你的問題是表明你試圖在web應用程序內運行OSGi。 ..你必須在那裏啓動OSGi或使用一個庫。 OSGi從基礎JVM的頂層開始,從類路徑的角度來看非常理智。基本的Java SE類型從JVM升級到OSGi包,但這是安全的,因爲沒有人足夠瘋狂從它們的包中重新導出標準Java SE類型。 – 2011-03-29 23:05:55

相關問題