簡體   English   中英

有沒有辦法在沒有 EAR 的情況下用 WAR 打包 EJB 模塊?

[英]Is there a way to package an EJB module with a WAR without an EAR?

我目前有以下項目結構

EAR
|---myapp1.war
|---myapp2.war
|---myapp-ejb.jar

我想擺脫耳朵並自行部署myapp1和myapp2。 我試圖使 myapp-ejb.jar 成為兩次戰爭的 maven 依賴項,並且在編譯時一切正常。 盡管如此,代碼中有很多 jndi 查找在部署時失敗。 有沒有辦法讓這個工作?

理論上,ejb 可能存在於 Web 存檔(war)中。

盡管不是必需的,但您可以嘗試放置一個“ejb-jar.xml”文件(位於 WAR 模塊的 WEB-INF 中)來替換正常的自動發現機制?

另請注意,WAR 文件必須是 2.5 版或更高版本才能包含 EJB 內容。

  1. 從 EAR 中提取 WAR

  2. 根據https://stackoverflow.com/a/42847318/8528208 將范圍 ejbs 作為“提供”

  3. 根據https://stackoverflow.com/a/6968674/8528208將 ejb.jar 放在 WAR 的 WEB-INF/lib 中

更多文檔位於https://www.ibm.com/docs/en/was/8.5.5?topic=modules-ejb-content-in-war

——

存檔的編輯評論是指:

更新 - ejb.jar 是否在 .war 的構建類路徑中? 如果您的項目是基於 maven 的,那么 ejb.jar 是 .war 項目的依賴項嗎? 如果是這樣,請嘗試根據https://stackoverflow.com/a/42847318/8528208添加 EJB 模塊作為“提供的”依賴項

——

“.ear 文件是實體的集合(即 .war 文件),因此您可以簡單地從 .ear 文件中提取 .war 文件並部署它。” -per https://stackoverflow.com/a/26658071

如果這沒有幫助,您能否在@EJB 注釋中添加查找屬性,例如

@EJB(lookup="java:global/mwf_ejb/UserManager")

類似於這個答案? https://stackoverflow.com/a/10156279/8528208

我正在寫我自己問題的答案,因為我解決了這個問題。 如此處所述,將 EJB 與僅 WAR(無 EAR)一起使用是完全沒問題的https://docs.oracle.com/cd/E19798-01/821-1841/gippi/index.html 至於查找調用,此處描述了正確的方法 :https://docs.oracle.com/cd/E19798-01/821-1841/girgn/index.html 正如我所想的那樣,我面臨的問題與查找並沒有真正的關系,而是由於大多數 EJB 的初始化方式造成的。 我注意到在大多數類中都有一些討厭的初始化代碼,如下所示:

@Stateless
public class FooResource
{
    FooEjb fooEjb = lookupFooEjb();
    
    private FooEjb lookupFooEjb()
    {
        javax.naming.Context c = new InitialContext();
        return (FooEjb) c.lookup("java:global/FooApplication/FooModule/FooEJB!FooInterface");
    }
}

這適用於 EAR,因為 EJB 模塊在 WAR 歸檔之前加載,因此查找不會失敗。 我的猜測是,當您使用 WAR 打包 EJB 時,它會根據需要加載 EJB,根據 @EJB 注釋計算依賴關系,因此這種初始化會失敗,因為 EJB 可能尚未加載。 為了使它工作,我只是刪除了查找並添加了注釋@EJB。

@Stateless
public class FooResource
{
    @EJB
    FooEjb fooEjb;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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