2011-07-11 90 views
0

我在使用appclient腳本調用glassfish 3.1的EJB上部署耳朵。 EJB有一個方法,它的參數是在單獨的庫中定義的模型對象。在appclient jar中包含模型庫

如果我想使用appclient腳本,我有一個調用EJB的主方法的Main類。 這也被放入一個單獨的jar中,也被部署到玻璃魚。

由於模型對象位於一個單獨的庫中,我需要它在客戶端jar中,但也在EJB中。 所以我需要在客戶端jar中以某種方式引用它。

客戶端jar是一個jar(杜),所以我不能添加其他罐子。 Java EE 6文檔說,我應該創建一個庫,但如果我這樣做,它不會部署,因爲耳朵至少需要一個ejb或Web模塊,而我的客戶機庫都沒有。

我找到的解決方案是使用程序集插件/ jar -with-dependencies。這個插件創建一個新的jar包含所有依賴關係的所有類。

此解決方案的工作原理,但我想知道如果這是要走的路或我錯過了明顯的東西,因爲我無法想象這是必需的。 EJB通常有模型對象作爲參數,所以這種情況會發生很多。

所以我的問題是:有沒有辦法告訴glassfish引用應用程序客戶端jar和ejb jar之間的共享庫。

回答

0

我做的方式是這樣的:

  • 獨立的Maven與示範項目。在我的情況下,這是一羣帶有JPA和JAX-B註釋,一些常量等的簡單POJO。在Maven中,我通過指定<packaging>bundle</packaging>將其定義爲OSGi包。我稱這個項目爲MyAppInterface
  • 單獨的Maven項目需要處理模型的其他元素。在我的情況下,我有一個Java EE應用程序,包含EJB,數據庫外觀,REST servlet;我有一個只進行測試的Integration-Test項目;一個GWT應用程序;等等......在這些項目中,我指定的依賴於模型:

    <dependency> 
        <groupId>com.skalio</groupId> 
        <artifactId>MyAppInterface</artifactId> 
        <version>1.0-SNAPSHOT</version> 
    </dependency> 
    
  • 當部署MyAppInterface到Glassfish的,我使用的語法如下:

asadmin deploy --type osgi --name MyAppInterface /path/to/MyAppInterface-1.0-SNAPSHOT.jar

  • 我理解它將模型放置在Glassfish的類路徑上,類似於mysql連接器,只有OSGi樣式。

我讓所有這些項目都由中央jenkins CI服務器構建,它將工件部署到我們內部的maven存儲庫。然後,我們在每個項目的pom.xml中添加內部存儲庫。因此,即使他們沒有在NetBeans/Eclipse中檢出代碼,每個人都可以自動使用最新的穩定版MyAppInterface

讓我知道你是否需要更多的例子。

+0

我也使用maven。我將項目分爲1)接口類,2)數據庫的jpa項目,3)數據庫的另一個jpa項目,以及4)使用其他項目的EJB的項目。最後,我有一個使用jpa類(模型)的appclient項目,並使用遠程接口調用EJB。我可以使用osgi類型選項來部署它們,但執行appclient時仍然會出現錯誤。你在使用osgi maven插件嗎?如果是的話,你可以發佈一個例子嗎? – thehpi

+0

沒有'osgi maven插件',我真的只是指定了''標籤...... – Hank

+0

這很奇怪,因爲我得到一個錯誤:'找不到包裝的生命週期映射:'包'。在組件庫中找不到組件描述符:org.apache.maven.lifecycle.mapping.LifecycleMappingbundle'。你可以發佈你的pom嗎? – thehpi