有没有办法在没有 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内容。
从 EAR
中提取 WAR
根据
“提供”的范围 ejbs
将 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;
}
我目前有以下项目结构
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内容。
从 EAR
中提取 WAR根据
“提供”的范围 ejbs将 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;
}