簡體   English   中英

在Tomcat中使用來自Java Web應用程序的OSGi Bundle

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM