EAR和分离的EJB + WAR有什么区别?

21

将应用程序部署为EAR(包含1个EJB模块和1个WAR模块)与单独的模块有什么区别?我想使用GlassFish 3 Web Profile,但它不支持EAR存档。我是否可以将EJB和WAR作为单独的模块使用?还有其他选项吗?

2个回答

33

似乎有些混淆了3个部署变体:

  1. 包括EJB和WEB模块的EAR
  2. 分别部署EJB模块和WEB模块
  3. 部署包含EJB类或EJB jar的WEB模块。

在第一种情况下,您实际上有一个应用程序,但它分为两个层。 WEB模块与EJB模块隔离,意味着它可以使用来自EJB模块的类,但是EJB模块无法使用来自WEB模块的类。由于它是单个应用程序,因此可以使用本地访问EJB bean,并且注入EJB bean的工作方式符合预期。

在第二种情况下(您在问题中提到的),实际上并没有逻辑上的单个应用程序,而是两个独立的模块。它们在同一个JVM中运行,但正式的Java EE不允许使用本地访问,必须使用远程访问(尽管实际上本地访问通常仍然有效)。此外,在Web模块中的bean中注入EJB bean不能直接使用简单的@EJB注释,而必须使用lookup属性指定全局JNDI名称。

最后,第三种情况(您似乎没有提到,但是'home'提到了)与第一种情况有些相似,但在这种情况下没有层和隔离。EJB bean可以直接访问Web模块的所有类。

Web配置文件仅支持此最后一种部署情况。不支持EAR和独立EJB部署。


谢谢,这让我清楚了很多。所以我应该选择完整的配置文件,因为我的项目中将有3个war模块与1个ejb通信。 - karolkpl
在第一种情况下,EJB模块能否像第二种情况中那样使用lookup属性访问WEB模块? - lpd
你能否看一下这个问题 https://stackoverflow.com/questions/49125538/is-it-possible-to-have-ejbs-in-domain1-lib-using-glassfish? - Pavel_K
能否为ejb模块定义一个“context-root”?为什么在ejb模块中的“websocket”无法访问,但在“war模块”中可以访问?是否有解决方案? - Hosein Aqajani

3

将应用程序部署为ear(具有1个ejb和1个war模块)与单独的模块有什么区别?

以下不是一个完整的列表:在EAR中,您可以定义Utility JARs,它们位于例如EAR/lib中,可以被WARsEJB JARs重用。通常EAR文件提供专有的部署功能,例如,在WebSphere中,您可以指定DataSource细节,这样您就不必使用管理实用程序定义DataSource(和JDBC驱动程序)。

由于我想使用Glassfish 3 web profile,但它不支持ear存档。 我能否简单地将ejb和war作为单独的模块使用?还有其他选择吗?

是的,web profile规范明确允许您将轻量级 EJB版本作为WAR的一部分进行部署。只需将EJB JAR放置在WARs WEB-INF/lib内即可。此链接提供了功能比较(Web profile与完整版):http://glassfish.java.net/downloads/v3-final.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接