有没有办法在没有 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 成为两个 war 的 Maven 依赖项,并且在编译时一切正常。然而,代码中有很多 jndi 查找在部署时失败。有没有办法让它发挥作用?

理论上,网络存档中可以包含 ejb (war)。

虽然没有必要,但您可以尝试放置一个'ejb-jar.xml'文件(位于WAR模块的WEB-INF中)来替换正常的自动发现机制?

也是warWAR文件必须是版本2.5或更高版本才能包含EJB内容。

  1. 从 EAR

    中提取 WAR
  2. 根据

    “提供”的范围 ejbs
  3. 将 ejb.jar 放入 WAR 的 WEB-INF/lib per

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

--

存档编辑评论参考:

更新- .war 的构建 class 路径中的 ejb.jar 是吗?如果您的项目是基于 Maven 的,那么 ejb.jar 是 .war 项目的依赖项吗?如果是这样,请尝试将 EJB 模块添加为每个

的“已提供”依赖项

--

“.ear 文件是实体的集合(即 .war 文件),因此您可以简单地从 .ear 文件中提取 .war 文件并部署它。” -每

如果这没有帮助,您能否在您的@EJB 注释中添加一个查找属性,例如

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

与这个答案相似?

我正在写我自己的问题的答案,因为我已经解决了这个问题。如此处 https://docs.oracle.com/cd/E19798-01/821-1841/gippi/index.html 所述,仅使用带有 WAR(无 EAR)的 EJB 是完全没问题的。 至于查找调用,这里描述了正确的方法 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;
}