2011-08-31 49 views
15

我試圖從Java Web應用程序調用OSGi包的方法。兩者都應該在Tomcat 7上運行。在Tomcat中使用來自Java Web應用程序的OSGi包

我已經編寫了一個普通的Java應用程序,它調用OSGi包中的方法,如本站所述:http://drupal.osgibook.org/node/37

爲了獲得Equinox環境的上下文,我從應用程序開始了它,並從內部安裝了捆綁包。此外,該上下文用於檢索正在運行的捆綁服務的服務引用並獲取其服務。

的EquinoxRunner類的runEquinox方法:

import org.osgi.framework.Bundle; 
import org.osgi.framework.BundleContext; 

public BundleContext runEquinox([...]) throws Exception { 
    [...] 

    BundleContext bundleContext = EclipseStarter.startup(new String[]{"-console"}, null); 
    bundleContext.installBundle("file:C:/.../plugins/myosgiclass.interface_1.0.0.201108301327.jar"); 
    Bundle bundleTranslationImpl = bundleContext.installBundle("file:C:/.../plugins/myosgiclass.impl_1.0.0.201108301327.jar"); 
    bundleTranslationImpl.start(); 

    [...] 
    return bundleContext; 
} 

和ServiceRunner類的invokeMethod中:使用eclipse bridge現在

import org.osgi.framework.BundleContext; 
import org.osgi.framework.ServiceReference; 

[...] 

public Object invokeMethod(BundleContext bundleContext, Object value, [...]){ 
    ServiceReference serviceReference = bundleContext.getServiceReference(MyOSGiClass.class.getName()); 
    Object result = null; 
    if (serviceReference != null) { 
     MyOSGiClass myOSGiClass = (MyOSGiClass) bundleContext.getService(serviceReference); 
     if (myOSGiClass != null) result = myOSGiClass.method(value); 
     bundleContext.ungetService(serviceReference); 
    } 
    return result; 
} 

,Tomcat上,我不知道如何檢索Equinox環境的正確背景。當我嘗試在Equinox的Tomcat上運行它時,我得到了NoClassDefFound異常。我將不勝感激關於如何解決這個問題的任何建議。

非常感謝。 Cheers,Nic

+0

我認爲關鍵是要保持對啓動OSgi框架的控制。我不太瞭解Equinox的確切工作方式,但我確定他們有類似於Felix所描述的內容,在這裏:http://felix.apache.org/site/apache-felix-framework-launching-and -embedding.html –

+0

感謝您的評論。這也是我嘗試的方法。雖然我需要在Tomcat服務器上運行我的項目,但上面描述的Bridge似乎是需要的 - 而且我無法手動啓動。或者有什麼方法可以繞過這個Bridge並使用手動啓動的OSGi框架? – Nicolas

+0

我看不出如何使用Tomcat將您與特定的servlet橋接實現聯繫起來。你爲什麼不開始定製'org.eclipse.equinox.servletbridge'項目? –

回答

2

當您嵌入這樣的OSGi框架,然後想要從外部環境訪問OSGi服務時,需要確保服務接口是OSGi內部和外部的相同的

因此,配置您的OSGi容器將服務接口的包從Tomcat導出到OSGi。爲了實現這一點,請使用'FRAMEWORK_SYSTEMPACKAGES_EXTRA'屬性來配置您的OSGi框架。

有關http://felix.apache.org/site/apache-felix-framework-launching-and-embedding.html#ApacheFelixFrameworkLaunchingandEmbedding-hostservices的更多信息(即使是針對Apache Felix,嵌入式API也是標準化的)。

+0

最新的鏈接:http://felix.apache.org/documentation/subprojects/apache-felix-framework/apache-felix-framework-launching-and-embedding.html – FableBlaze

2

我在使用EclipseStarter這個東西之前就已經完成了這個工作,並且要做好很多工作來獲得正確的類路徑,這是關鍵。您還必須使用反射來呼叫EclipseStarter。看起來他們已經標準化了,所以你不需要使用EclipseStarter

這裏的關鍵(在Felix article中簡要提及的是,你必須在Tomcat環境和OSGi環境之間有一個共享類路徑,如果你從「使用Bundles提供的服務」開始看這篇文章, ,它似乎暗示了你想要的東西

你將需要一個接口來調用你的Tomcat(父類)類路徑,然後你需要啓動該框架,以便它首先使用你的父類路徑這可能不是他們的啓動器東西的作品),並且你需要排除提供OSGi包的接口的包,我通過製作一個單獨的OSGi包(API包)廣告接口,所以當我想在從OSGi外部調用我的代碼的上下文中使用此設置時,我不會提供該API包。

0

我克服了這個挑戰,通過覆蓋JasperClass Loader,每個bundle發生了什麼,因爲它自己的類加載器classdeffnotfound是因爲正在使用tomcat加載器。網上有更多的資源。

0

對不起,我不會直接回答你的問題... 從我的角度來看,你不採取好的方法,你有沒有任何寶貴的理由來使用現有的Tomcat 7實例? 我會使用更多的以OSGi爲中心的方法,並使用標準Http服務來發布您的Web應用程序......在這種情況下,這兩個組件與標準OSGi軟件包處於同一級別,因此2個組件之間的通信是真的易(直接法invokation或使用的EventAdmin服務異步消息) HTH 我的2美分 傑羅姆 PS: 這種方法給你更多的靈活性,它可以與春分或任何其他OSGi使用外殼,你想要的(菲利克斯,knopflerfish。 。)

相關問題