[英]Using an OSGi Bundle from a Java Web Application in Tomcat
我試圖從Java Web應用程序調用OSGi包的方法。 兩者都應該在Tomcat 7上運行。
我已經編寫了一個普通的Java應用程序來調用OSGi包中的方法,如本網站所述: http : //drupal.osgibook.org/node/37 。
為了獲得Equinox環境的上下文,我從應用程序啟動它並從內部安裝了bundle。 此外,上下文用於檢索正在運行的包的服務引用並獲取其服務。
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:
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;
}
現在,在使用eclipse橋的 Tomcat上,我不知道如何檢索Equinox環境的正確上下文。 當我嘗試使用Equinox在Tomcat上運行它時,我得到NoClassDefFound Exceptions。 我很感激有關如何解決這個問題的任何建議。
非常感謝提前。 干杯,尼克
我在使用帶有橋接器的EclipseStarter
之前已經完成了這項工作,並且要獲得類似路徑的東西是很重要的,這是關鍵。 您還必須使用反射調用EclipseStarter
。 從那時起,它們看起來已經標准化,因此您不需要使用EclipseStarter
。
這里的關鍵(正如Felix文章中簡要提到的那樣,你必須在Tomcat環境和OSGi環境之間有一個共享的類路徑。如果你在“使用Bundles提供的服務”一節中查看那篇文章,似乎建議你想要什么。
您將需要在Tomcat(父)類路徑中擁有一個接口,然后您需要啟動框架,使其首先使用您的父類路徑(這可能不是它們的啟動器工作),並且您需要從OSGi包中排除提供接口的包。 我通過制作一個只有接口的獨立OSGi包(API包)來實現這一點,所以當我想在從OSGi外部調用我的代碼的上下文中使用此設置時,我不會提供該API包。
當您嵌入這樣的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也是標准化的)。
我通過覆蓋JasperClass Loader克服了這個挑戰,因為它自己的類加載器classdeffnotfound是因為正在使用tomcat加載器,所以每個bundle都會發生什么。 網上有更多資源。
對不起,我不會直接回答你的問題......從我的觀點來看,你沒有采取好的方法,你有任何有價值的理由使用現有的Tomcat 7實例嗎? 我將使用更多以OSGi為中心的方法,並使用標准的Http服務來發布您的Web應用程序......在這樣的上下文中,這兩個組件與標准OSGi包處於同一級別,因此兩個組件之間的通信非常簡單(使用EventAdmin服務的直接方法調用或異步消息)HTH我的2美分Jerome PS:這種方法為您提供了更大的靈活性,它可以與Equinox或您想要的任何其他OSgi shell一起使用(felix,knopflerfish ..)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.