2011-12-02 76 views
1

我一直在做關於將Eclipse插件公開爲Web服務的研究,但是我感到困惑。如何將Eclipse插件作爲Web服務公開?

我的要求基本上是爲一組Web服務構建一個Equinox後端。 我將大量使用EMF和相關項目,所以考慮到這一目標,我一直在閱讀關於Equinox/OSGI以及構建我所需的選項。

但是,有一些神祕的觀點,總體來說還有大量的項目。鑑於下面的調查結果,我想聽聽你的建議。也許有一個選項我錯過了,或者你以前做過。這裏是被提名者(鼓點)

在Web容器中託管Equinox。使用bridge.war,插件可以暴露一個servlet。問題是,爲了使用像RESTEasy這樣的好REST框架(我最喜歡的),REST框架需要是一個生活在Equionox運行時的osgi包。我花了3天時間,並且由於類加載器問題,這不起作用。我現在確信我無法在Equinox中擁有RestEasy。我可以在Web容器中使用RestEasy,並使用XML序列化/反序列化將Web容器中的代碼與Equionox中的代碼進行對話,但是這樣感覺像是浪費了資源。不過,這可能會起作用。

另一種選擇似乎是ECF,它是分佈式OSGI的實現,它似乎支持SOAP/Rest。但是,我找不到一個將Equinox託管的功能公開爲Web服務的清晰教程。所以這仍然迫使我不要使用RestEasy,但至少它似乎給了我一個適合Equinox的框架。我可能仍然需要將其保存在Web收件人的可擴展性中。

然後是Eclipse處女座,它似乎支持託管Web應用程序以及OSGI運行時,顯然Web容器託管的代碼可以與OSGI運行時代碼交談。不過,我不確定是否可以傳遞類,因爲在Web容器下創建的Jaxb註釋類型A可能使用與OSGI運行時插件不同的類加載器。此外,這種設置將我鎖定在處女座,我寧願與JBoss等一起用於生產。

因此,鑑於這些選項以及可能更多我目前不知道的內容,您將如何將EMF和其他基於Eclipse框架的項目公開爲Web服務?

編輯: 基於我希望添加更多的好迴應。問題的部分細節,部分評論不適合評論部分。

我在問題後的研究讓我與接受的答案完全相同:Apache CXF現在是分佈式OSGI的實現,這很好。我放棄了RestEasy。我目前的擔心是,我已經有一個XSD創建了我的類。 RestEasy使暴露這些變得非常容易,我必須在這裏做同樣的事情。我的插件將不得不使用這些基於JAXB的類。在最壞的情況下,我可能會嘗試使用提供JAXB支持的Eclipse Link項目,以創建XML內容,並通過基本的servlet使用或基於CXF的字符串值傳遞它。所以這裏討論的解決方案並不完美,但我認爲這是目前最好的解決方案。

回答

1

我工作的產品已完成此操作。我們在Web容器內部有Equinox。我們使用Apache CXF公開SOAP和REST Web服務。用一些黑魔法來正確連接一切。我發現CXF文檔不太好,尤其是OSGI。

我相信你知道,在Web容器中託管Equinox並不是一個推薦的做法,儘管如果你想使用OSGI是很難避免的。我們也經歷了一些類加載問題。實際上,我們從未真正喜歡OSGI(模塊化等)的廣告效益。現在回到現在爲時已晚。 OSGI不應輕易進入。

因此,以下是我們如何使用CXF啓用SOAP/REST的快速概述。希望這至少能讓你朝着正確的方向發展。

1)安裝CXF OSGi bundle了,核心和DOSGI - 我們使用以下: CXF束-最小-2.2.12.jar CXF-dosgi裏發現本地-1.1.jar CXF -dosgi-RI-DSW-CXF-1.1.jar 鏈接: http://cxf.apache.org/download.html

2)安裝JAX-RS(REST)和JAX-WS(SOAP)的API -The API定義是在org.apache.servicemix .specs.jsr311-api-1.0-1.3.0.jar和org.apache.servicemix.specs.jaxws-api-2.1-1.1.1.jar(這些是我們的版本) - 這些可能會也可能不會與CXF捆綁在一起。在我們的例子中,只包含了JAX-WS jar。我們不得不搜索JAX-RS軟件包。 - 除了在webapp(WEB-INF/eclipse/plugins)中安裝bundle之外,我們還必須將它們添加到ECLIPSE/plugins目錄進行編譯。

3)告訴Equinox加載CXF插件。有可能有其他方法來做到這一點。我們用WEB-INF/eclipse/configuration/config.ini中的條目完成了這項工作。 - 如果此文件存在,請將新罐添加到osgi.bundles屬性中: osgi.bundles = ... [email protected],org。 [email protected][email protected],\ cxf-dosgi-ri- [email protected]:start,\ [email protected]:start,\ [email protected]:start

4)就是這樣。您現在應該能夠開始編寫SOAP和REST服務。這是一個Java優先的方法(首先與XML模式相反)。這意味着你: - 定義一個Java接口 - 配置CXF將接口發佈爲REST或SOAP端點。

這是REST的一個非常簡單的例子。它帶有標準的免責聲明,它是特定於我們的環境的。因人而異。

一)我們用聲明式服務,所以首先我們定義在我們包的清單 服務組件的DS文件:META-INF/DS/helloworld.xml B)下面是DS文件:META-INF/DS /helloworld.xml。 DS文件定義OSGI包中的服務及其依賴關係。爲簡潔起見,這些條目已被省略。

<?xml version="1.0"?> 
<components xmlns="http://www.osgi.org/xmlns/scr/v1.0.0"> 

<component name="hello_world_service" xmlns="http://www.osgi.org/xmlns/scr/v1.0.0"> 

    <!-- Defines this as a REST service ---> 
    <property name="service.exported.configs" value="org.apache.cxf.rs"/> 
    <!-- This is the URI of your REST resource. 
    It is realtive to the Equinox bridge servlet in your webapp --> 
    <property name="org.apache.cxf.rs.httpservice.context" value="/helloworld" /> 
    <!-- This is the java interace that will be exposed . You 
    will use JAX-RS annotations to map these java methods to HTTP verbs. --> 
    <property name="service.exported.interfaces" value="com.foo.IHelloWorldService"/>   
... 

</components> 

C)下面是接口類:

package com.foo; 

@Path("/greeting") 
public Interface IHelloWorldService { 

    @GET 
    @Produces("application/xml") 
    public Greeting getGreeting(); 

} 

public class HelloWorldService implements IHelloWorldService { 
    @override 
    public Greeting getGreeting() { 
     Greeting g = new Greeting(); 
     g.message = "Hello World"; 
     return g; 
    } 
} 

d)因此,一旦這是所有的地方,你應該能夠得到以下網址:

/<web-app-name>/bridge/helloworld/greeting 

並收到以下回應:

<Greeting> 
     <message>Hello World</message> 
    </Greeting> 

祝你好運。希望這可以幫助。

+0

非常好的答案,非常感謝您的詳細回覆。請參閱我的「原始問題」的補充,該問題在「編輯:」之後開始。 – mahonya

+0

另一個關鍵問題是:那麼建議如何公開OSGI?如果不在網絡servlet中運行Equionox? – mahonya

+0

推薦的方法是將Web/servlet容器嵌入到OSGI容器中。這並不總是可能的,但是並不是所有的web容器都有OSGI實現。 – EJK

1

不幸的是我認爲RESTeasy是這裏的問題。根據您對另一個問題的評論,RESTeasy使用Java ServiceLoader API動態查找類,但不幸的是,在任何非平坦(即模塊化)類加載體系結構中,都會假設類加載是不真實的。

我鼓勵你在RESTeasy論壇上詢問關於查找這些類的ServiceLoader方法的替代方法。例如,可能顯式註冊這些類。

但是,如果您的解決方案無法繼續使用RESTeasy,那麼您可以在OSGi中使用其他REST API。 Restlet例如有明確的OSGi支持。我也成功地使用了澤西島。

+0

謝謝,會同時檢查。 – mahonya