2013-04-17 105 views
0

我在使用servletbridge osgi實現訪問在tomcat中部署的簡單WAB時遇到問題。tomcat中的簡單Web應用程序包(WAB)osgi實現

我能夠使用純粹的osgi包使用HttpService以編程方式註冊jsp/servlets/html並且可以訪問這個包。接下來我嘗試的是創建一個包含一個html和一個servlet資源的單獨WAB,但遇到訪問該包的一些問題。我嘗試了震動和未捆綁的捆綁。我現在假設的是,對於WAB,我不需要以編程方式或以聲明方式註冊我的資源?

下面是我創建的WAB包。它不包含任何Http Service Tracker,只是一個在控制檯上顯示激活和停用消息的激活器。

sample.http1 

    helloworld.html 

    |META-INF 
     MANIFEST.MF 

    |WEB-INF 
     web.xml 
     |classes 
      |sample 
       |http 
         Activator.class 
         HelloWorldServlet.class 

下面是MANIFEST.MF文件

Manifest-Version: 1.0 
Bundle-ManifestVersion: 2 
Bundle-Name: sample.http1 
Bundle-SymbolicName: sample.http1 
Bundle-Version: 1.0.0 
Bundle-Activator: sample.http.Activator 
Import-Package: javax.servlet,javax.servlet.http,org.osgi.framework, org.osgi.service.http, org.osgi.util.tracker 
Bundle-ClassPath: WEB-INF/classes 
Web-ContextPath: /samplehttp 

下面是Activator類

package sample.http; 
import org.osgi.framework.BundleActivator; 
import org.osgi.framework.BundleContext; 
public class Activator implements BundleActivator { 

    public void start(BundleContext context) throws Exception { 
    System.out.println("Starting Hello World"); 
} 
     public void stop(BundleContext context) throws Exception { 
      System.out.println("Stopping Hello World"); 
}  
} 

下面的代碼是web.xml中

<?xml version="1.0" encoding="UTF-8"?> 
<web-app> 
<servlet> 
<servlet-name>helloworld</servlet-name> 
<servlet-class>sample.http.HelloWorldServlet</servlet-class> 
</servlet> 
<servlet-mapping> 
<servlet-name>helloworld</servlet-name> 
<url-pattern>/helloworld</url-pattern> 
</servlet-mapping> 
</web-app> 

的內容然後我激活了這個包。並嘗試訪問下面的WAB資源,但我得到一個404頁面資源未找到錯誤。

http://localhost/bridge/samplehttp/helloworld.html - 用於在靜態html

http://localhost/samplehttp/helloworld.html

http://localhost/bridge/samplehttp/helloworld - 用於在HelloWorldServlet

http://localhost/samplehttp/helloworld

的Tomcat託管在端口80,我可以訪問我的其他OSGi包它們是使用HttpService以編程方式註冊的。下面的osgi包完美地工作。

e.g http://localhost/bridge/jsp-examples/helloworld.jsp

請指點。我已經參考了osgi規範文檔和另一個博客 http://www.javabeat.net/2011/11/writing-an-osgi-web-application/

+0

你確實需要在Tomcat中運行你的應用程序嗎?曾考慮遷移到像Apache Karaf或Eclipse Virgo這樣的OSGi容器? –

+0

@AchimNierbeck我實際上正在研究現有的部署。 Osgi tomcat是SAP業務對象4工具中使用的標準部署。我有興趣添加自己的捆綁包,因此我無法更改其現有結構。 –

回答

0

您的嵌入式OSGi容器設置是否支持WAB?什麼樣的osgi框架正在運行?是否只有可用的HttpService?只要您沒有支持WAB(例如Felix HTTP-Service不支持此功能),您就是徒勞的。如果可以更改HTTP服務,您可以考慮使用它的Pax-Web實現,它支持std。 HTTP-Service,一個WhiteBoard Extender,當然還包括對WAB的全面支持。最新的一個甚至支持Servlets 3.0。 儘管如果你綁定到一個現有的基礎設施,而你不允許改變,那麼你無法做任何事情來部署一個WAB。 這是一種「怪」在其自身運行的WAR容器內:-)

所以,如果你想使用這個場景,你可能需要做類似下面基本上是一個OSGi容器部署WAB: 有一個在Tomcat中運行的WAR應用程序,讓您的OSGi服務在另一個WAR中的OSGi-Container內運行。遠程HTTP調用OSGi-War中的服務。

+0

正在使用的OSGi容器是使用定製的ServletBridge的Eclipse Equinox,它在tomcat中作爲WAR進行部署。該軟件包存在於Tomcat6 \ webapps \ bridge \ WEB-INF \ eclipse \ plugins中。由開發人員創建並部署在此目錄中的現有插件具有類似結構的tomcat webapps,例如具有web/WEB-INF並在這些web.xml中定義過濾器和servlet。我在某處讀到的一點是,如果你的OSGi容器不支持WAB,那麼它不可能使用過濾器並定義你的servlet,你將不得不使用HttpService來註冊所有的資源。 –

+0

但是由於我可以看到這些軟件包處於活動狀態,並且可以通過網址訪問,因此它們看起來像WAB,因爲它們使用web.xml來定義一些資源。但同時我可以看到他們的MANIFEST.MF不包含Web-ContextPath,我也無法驗證他們的Activator類,因爲我沒有現有插件的源代碼。我不確定我說的是否有足夠的理解力,我想知道的是現有的插件是否真的是WAB,如果是,那麼我想部署我自己的WAB –

+0

從你告訴我的內容我認爲你只是有一個簡單的HTTP服務運行,不知道所有這些「WAB」如何運行,或者更糟糕的是,每一場戰爭都提供了一個OSGi框架。然後我會說這是一個真正奇怪的設置... 同樣,HTTP服務和WAB支持是僅從osgi框架開箱即用* not *支持的彙編服務。因此,您需要一些提供此功能的附加服務。再次,它最有可能是你正在使用的felix-http-service +網橋。 - >留下你與我以前的答案:) –

相關問題