.war与.ear文件的区别

615

.war文件和.ear文件有什么区别?


13
欢迎来到Java世界,这里有人认为将一个带有.zip扩展名的压缩文件留下来不够专业,因此必须根据最终移动的位置将其重命名为.jar / .ear或.war。 - pistacchio
9个回答

666

WAR(Web Archive)是一个模块,它被加载到Java应用服务器Web容器中。Java应用服务器有两个容器(运行环境)——一个是Web容器,另一个是EJB容器。

Web容器基于JSP或Servlets API托管Web应用程序,专门设计用于Web请求处理,因此更多地采用请求/响应式分布式计算。Web容器需要将Web模块打包为WAR文件——这是一个特殊的JAR文件,其中包含WEB-INF文件夹中的web.xml文件。

EJB容器基于EJB API托管企业Java Bean,旨在提供扩展业务功能,例如声明性事务、声明性方法级安全和多协议支持,因此更多地采用RPC式分布式计算。EJB容器要求将EJB模块打包为JAR文件——这些文件在META-INF文件夹中有一个ejb-jar.xml文件。

企业应用程序可能由一个或多个模块组成,可以是Web模块(打包为WAR文件)、EJB模块(打包为JAR文件)或两者都有。企业应用程序被打包为EAR文件―这些是包含META-INF文件夹中的application.xml文件的特殊JAR文件。

基本上,EAR文件是一个超集,包含WAR文件JAR文件。Java应用服务器允许在WAR文件中部署独立的Web模块,但在内部,它们创建EAR文件作为WAR文件的包装器。独立的Web容器,例如TomcatJetty不支持EAR文件―这些不是完整的应用服务器。这些容器中的Web应用程序只能以WAR文件形式部署。

在应用服务器中,EAR文件包含配置,例如应用程序安全角色映射、EJB引用映射和Web模块的上下文根URL映射。

除了Web模块和EJB模块,EAR文件还可以包含打包为RAR文件的连接器模块和打包为JAR文件的客户端模块。


37
因为这个答案解释了为什么你可能想要使用其中之一,所以我会给它点赞。 - Jason Wheeler
9
是的,.jar.war.ear文件都是简单的zip压缩文件,因此可以被任何能处理普通.zip文件的程序打开。 - acdcjunior
是否可以为EJB模块定义上下文根(context-root)?为什么在EJB模块中的Websocket不可访问,而在WAR模块中则可访问?有没有解决办法? - Hosein Aqajani

518

来自GeekInterview

在J2EE应用程序中,模块根据其功能打包为EAR、JAR和WAR。

JAR: 包含企业Java Bean(类文件)和EJB部署描述符的EJB模块被打包为扩展名为.jar的JAR文件。

WAR: 包含Servlet类文件、JSP文件、支持文件、GIF和HTML文件的Web模块被打包为扩展名为.war(Web归档)的JAR文件。

EAR: 所有上述文件(.jar和.war)都被打包为扩展名为.ear(企业文档)的JAR文件,并部署到应用服务器中。


66
这篇文章让我认为EAR只是将JAR和WAR结合在一起形成一个大的EAR,但我认为情况并不那么简单。 - Lay González
4
所有的文件本质上都是Java归档文件(JAR),只是拥有不同的扩展名来暗示它们的性质/内容。 - KNU
1
在大多数情况下,EAR和用于bean的单独JAR是不必要的。一个简单的WAR文件,将所有类打包到一个归档文件中是正常的。这里有一个更详细的解释:http://www.adam-bien.com/roller/abien/entry/ears_wars_and_size_matters - Kaspars Rinkevics

42

WAR - 网络存档。它用于根据Servlet标准部署Web应用程序。它是一个包含特殊目录WEB-INF和其中的多个文件和目录(web.xml、lib、classes)以及Web应用程序的所有HTML、JSP、图像、CSS、JavaScript和其他资源的jar文件。

EAR - 企业存档。它用于部署包含EJBs、Web应用程序和第三方库的企业应用程序。它也是一个jar文件,具有一个名为APP-INF的特殊目录,其中包含application.xml文件,并且包含jar和war文件。


你是不是想说META-INF而不是APP-INF目录? - Zavael
能否为ejb模块定义“context-root”?为什么在ejb模块中的websocket无法访问,但在“war模块”中可以访问?是否有解决方案? - Hosein Aqajani

28

WAR(Web Archive)文件包含Servlet类文件、JSP(Java Servlet页面)、HTML和图形文件以及其他支持文件。

EAR(Enterprise Archive)文件包含WAR文件以及包含代码的JAR文件。

这些文件中可能还有其他内容,但它们基本上是为其名称所表示的内容而设计的:WAR用于Web类型的内容,EAR用于企业类型的内容(WARs、代码、连接器等)。


2
在我的情况下,我总是将带有JAR的WAR部署在WEB-INF/lib文件夹中,这样也能正常工作。那么我为什么要使用EAR归档文件呢? - swapyonubuntu
2
@swapyonubuntu,如果你只是部署单个Web应用程序(更具体地说,是单个Servlet上下文),那么使用WAR文件没有任何问题。EAR文件更适合完整的企业应用程序,包括具有多个Web应用程序的应用程序。 - paxdiablo
2
在微服务时代,将每个WAR完全分开并单独部署,而不是将它们捆绑成一个单块的EAR,这样做是否更有意义? - Sayo Oladeji
能否为ejb模块定义“context-root”?为什么ejb模块中的websocket不可访问,而在war模块中是可访问的?是否有解决方案? - Hosein Aqajani
1
@HoseinAqajani:为什么你要在一个十年前的答案的评论框中提问?应该作为一个新问题提出,这样你会得到比我更多的回复(顺便说一句,我已经五年没有做过Java相关的事情了)。 - paxdiablo
抱歉亲爱的@paxdiablo,我已经问过了,但没有人回答... - Hosein Aqajani

25

JAR文件

JAR(Java存档)文件允许将多个文件合并为一个文件。扩展名为“.jar”的文件被软件开发人员用于分发Java类和各种元数据,其中还包括库和资源文件以及附件文件(如属性文件)。

用户可以使用Java开发工具包(JDK)的“.jar”命令或ZIP工具提取和创建JAR文件。

JAR文件还有可选的清单文件。清单文件中的条目规定了JAR文件的使用方式。“主”类规范指定一个文件类作为一个独立的或“独立运行”的程序。

WAR文件

WAR(Web应用程序归档)文件可包含XML(可扩展标记语言)文件、Java类以及用于Internet应用程序的Java Server页面。它还用于标记构成Web应用程序的库和网页。扩展名为“.war”的文件包含Web应用程序,可用于服务器或JSP(Java Server Page)容器。它包含用于创建上述Web应用程序的JSP、HTML(超文本标记语言)、JavaScript以及各种文件。

WAR文件的结构允许特殊目录和文件。它还可以具有数字签名(与JAR文件类似),以显示代码的真实性。

EAR文件

EAR(企业存档)文件将JAR和WAR文件合并为一个档案。这些扩展名为“.ear”的文件具有用于元数据的目录。模块打包到一个归档中,以便应用服务器的不同模块可以平滑且同时运行。

EAR文件还具有部署描述符(这些是XML文件),可以有效地指示不同模块的部署。

enter image description here


2
应该是最佳答案,因为有优秀的图形。谢谢,非常有帮助! - fl0w
能否为EJB模块定义“context-root”?为什么EJB模块中的websocket是不可访问的,但在WAR模块中是可访问的?有解决方案吗? - Hosein Aqajani

12

参考:http://www.wellho.net/mouth/754_tar-jar-war-ear-sar-files.html

tar(磁带档案) - 使用的格式是按序列编写的文件单位:文件名、文件大小、文件数据 - 不压缩,可能很大

Jar(Java 档案) - 使用压缩技术 - 通常包含 Java 信息,如类和 Java 文件。但也可以包含任何文件和目录结构

war(Web 应用程序档案) - 类似于 Jar 文件,只有特定的目录结构符合 JSP/Servlet 规范以供部署使用

ear(企业档案) - 类似于 Jar 文件。具有遵循 J2EE 要求的目录结构,以便在 J2EE 应用服务器上进行部署。 - 可以包含多个 JAR 和 WAR 文件


7

Ear文件提供更多选项来配置与应用服务器的交互。

例如:如果应用服务器的Hibernate版本比您的依赖项提供的版本旧,您可以将以下内容添加到ear-deployer-jboss-beans.xml中,以便JBOSS隔离类加载器并避免冲突:

<bean name="EARClassLoaderDeployer" class="org.jboss.deployment.EarClassLoaderDeployer">    
  <property name="isolated">true</property>
</bean>

或者到 src/main/application/META-INF/jboss-app.xml 文件中:
<?xml version="1.0"?>
<jboss-app>
<loader-repository>
    loader=nameofyourear.ear
<loader-repository-config>java2ParentDelegation=false</loader-repository-config>
</loader-repository>
</jboss-app> 

这将确保您的应用程序和应用服务器之间不存在类加载器冲突。
通常,类加载器机制的工作方式如下:
当一个类加载请求提交给类加载器时,它首先要求其父类加载器满足该请求。父级再向其父级请求类,直到请求达到层次结构的顶部。如果处于层次结构顶部的类加载器无法满足请求,则调用它的子类加载器负责加载类。
通过隔离类加载器,您的 ear 类加载器将不会查找父类(= JBoss / 其他 AS 类加载器)。据我所知,这在 war 文件中不可能实现。

KNU:使用ear文件的原因比仅仅使用它更加合理,因为正如接受的答案所述,“它包含Servlet类文件、JSP文件、支持文件、GIF和HTML文件”。而war文件也可以包含gif、html、jsp和servlet等文件。如果每个人都“发挥自己的优势”回答问题,或许我们都能在这个问题上变得更加聪明。 - Mark
Maven会为你完成这个任务,不是吗?你可以按版本指定依赖项,它们将被包含在/lib文件夹中。(在war文件中) - Sebas
是的,但应用服务器/Servlet容器可以选择使用其自己lib文件夹中提供的库来覆盖这些库。这可以防止这种情况发生。这完全取决于所使用的类加载机制。 - Mark

7
J2EE定义了三种类型的归档文件:
  1. Java Archive (JAR) JAR文件封装一个或多个Java类、清单和描述符。JAR文件是最基本的归档文件类型。在J2EE中,JAR文件用于打包EJB和客户端Java应用程序。

  2. Web Archive (WAR) WAR文件与JAR文件相似,不同之处在于它们专门用于创建由Servlets、JSPs和支持类构成的Web应用程序。

  3. Enterprise Archive (EAR) EAR文件包含构成特定J2EE应用程序的所有组件。


1
使项目传输、部署变得更加容易,需要将其压缩成一个文件。 JAR(Java 归档)是一组 .class 文件。
WAR(Web 归档)- 每个 WAR 代表一个 Web 应用程序 - 只使用与 Web 相关的技术,如 Servlet,可以使用 JSP。 - 可以在 Tomcat 服务器上运行 - Web 应用程序仅由与 Web 相关的技术开发,例如 JSP Servlet HTML JS - 仅用于信息表示,没有事务处理。
EAR(企业归档)- 每个 EAR 代表一个企业应用程序 - 我们可以使用来自 J2EE 的任何内容,例如 EJB,JMS 可以愉快地使用。 - 可以在 Glassfish 等服务器上运行,而非 Tomcat 服务器。 - 企业应用程序使用任何技术开发,包括 J2EE 中的所有 Web 应用程序以及 EJB、JMS 等。 - 具有信息表示和事务处理。例如银行应用程序、电信应用程序。

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