ChatGPT解决这个技术问题 Extra ChatGPT

.war 与 .ear 文件

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

欢迎来到 Java 世界,有人认为留下 .zip 扩展名的 zip 文件不够企业化,因此必须根据最终移动的位置将其重命名为 .jar / .ear 或 .war。

M
M.S. Dousti

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

Web 容器 托管基于 JSP 或 Servlets API(专为 Web 请求处理而设计)的 Web 应用程序,因此更像是一种分布式计算的请求/响应风格。 Web 容器要求将 Web 模块打包为 WAR 文件 - 这是一个特殊的 JAR 文件,在 WEB-INF 文件夹中有一个 web.xml 文件。

EJB 容器 托管基于 EJB API 的 Enterprise java bean,旨在提供扩展的业务功能,例如声明性事务、声明性方法级别的安全性和多协议支持 - 所以更像是一种分布式计算的 RPC 风格。 EJB 容器要求将 EJB 模块打包为 JAR 文件 - 这些在 META-INF 文件夹中有一个 ejb-jar.xml 文件。

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

基本上,EAR 文件 是包含WAR 文件JAR 文件 的超集。 Java 应用服务器允许在 WAR 文件中部署独立的 Web 模块,尽管在内部,它们创建 EAR 文件作为 WAR 文件的包装器。 TomcatJetty 等独立 Web 容器不支持 EAR 文件——这些不是成熟的应用程序服务器。这些容器中的 Web 应用程序只能部署为 WAR 文件。

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

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


+1,因为此答案描述了您可能要使用其中一个的原因。
@KNU 是的,.jar.war.ear 文件是简单的 zip 存档,因此可以被任何可以处理普通 .zip 文件的程序打开。
是否可以为 ejb module 定义 context-root ?为什么 ejb 模块中的 websocket 不可访问,但 war module 中的 websocket 可访问?!!!有什么解决办法吗?
Y
Yunnosch

GeekInterview

在 J2EE 应用程序中,模块根据其功能打包为 EAR、JAR 和 WAR JAR:包含企业 Java bean(类文件)和 EJB 部署描述符的 EJB 模块打包为扩展名为 .jar 的 JAR 文件Servlet 类文件、JSP 文件、支持文件、GIF 和 HTML 文件打包为带有 .war(Web 存档)扩展名的 JAR 文件 EAR:所有上述文件(.jar 和 .war)都打包为带有 .ear 的 JAR 文件(企业档案)扩展并部署到应用程序服务器中。


这篇文章让我觉得EAR只是一个大EAR中的JARS和WARS,我认为这并不是那么简单。
本质上都是存档(JAR),但具有不同的扩展名来暗示它们的性质/内容。
在大多数情况下,不需要 EAR 和用于 bean 的单独 JAR。在一个存档中包含所有类的简单 WAR 是正常的。下面是更详细的解释:adam-bien.com/roller/abien/entry/ears_wars_and_size_matters
D
David Rabinowitz

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

耳朵 - 企业档案。它用于部署包含 EJB、Web 应用程序和 3rd 方库的企业应用程序。它也是一个 jar 文件,它有一个名为 APP-INF 的特殊目录,其中包含 application.xml 文件,它包含 jar 和 war 文件。


你的意思是 META-INF 而不是 APP-INF 目录?
是否可以为 ejb module 定义 context-root ?为什么 ejb 模块中的 websocket 不可访问,但 war module 中的 websocket 可访问?!!!有什么解决办法吗?
p
paxdiablo

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

EAR(企业档案)文件包含 WAR 文件以及包含代码的 JAR 文件。

这些文件中可能还有其他东西,但它们基本上意味着它们听起来像它们的意思:WAR 用于 Web 类型的东西,EAR 用于企业类型的东西(WAR、代码、连接器等)。


在我的情况下,我总是在 WEB-INF/lib 文件夹中部署带有 jar 的 WAR,这很有效。那么我为什么要使用 EAR 存档呢?
@swapyonubuntu,如果您只是部署一个 Web 应用程序(更具体地说,是一个 servlet 上下文),那么只做 WAR 文件没有任何问题。 EAR 文件更适合成熟的企业应用程序,包括具有许多 Web 应用程序的企业应用程序。
在这个微服务时代,将每个 WAR 完全分开并单独部署而不是将它们捆绑到一个单一的 EAR 中不是更有意义吗?
是否可以为 ejb module 定义 context-root ?为什么 ejb 模块中的 websocket 不可访问,但 war module 中的 websocket 可访问?!!!有什么解决办法吗?
@HoseinAqajani:您为什么要在十年前的答案的评论框中提出问题?应该将它作为一个新问题提出,这样您就会得到更多的答复,而不仅仅是我(顺便提一下,我已经有大约五年没有做过任何 Java 的事情了)
J
Joby Wilson Mathews

JAR 文件

JAR(Java Archive 的缩写)文件允许将多个文件组合成一个文件。带有“.jar”的文件;软件开发人员利用扩展来分发 Java 类和各种元数据。它们还包含库和资源文件,以及附件文件(例如属性文件)。

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

JAR 文件具有可选的清单文件。清单文件中的条目规定了 JAR 文件的用途。文件类的“主”类规范将文件表示为分离或“独立”程序。

战争文件

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

WAR 文件的结构是这样的,以允许特殊的目录和文件。它也可能有一个数字签名(很像 JAR 文件的签名)来显示代码的真实性。

EAR 文件

EAR(企业存档)文件将 JAR 和 WAR 文件合并到一个存档中。这些带有“.ear”扩展名的文件有一个元数据目录。这些模块被打包到存档中,以便在应用服务器中平滑和同时操作不同的模块。

EAR 文件还具有部署描述符(它们是 XML 文件),它们有效地规定了不同模块的部署。

https://i.stack.imgur.com/WHk66.png


应该是优秀图形的最佳答案,谢谢,很大的帮助!
是否可以为 ejb module 定义 context-root ?为什么 ejb 模块中的 websocket 不可访问,但 war module 中的 websocket 可访问?!!!有什么解决办法吗?
K
Kanad

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

tar(磁带存档)- 使用的格式是以 fileName、fileSize、fileData 的串行单元写入的文件 - 无压缩。可能很大

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

战争(Web 应用程序档案) - 类似于 jar 文件,仅具有根据 JSP/Servlet 规范的特定目录结构,用于部署目的

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


A
Aritz

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

例如:如果应用服务器的休眠版本比你的依赖提供的版本更旧,你可以在 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> 

这将确保您的应用程序和应用程序服务器之间没有类加载器冲突。

通常类加载器机制是这样工作的:

当类加载请求提交给类加载器时,它首先要求其父类加载器完成请求。反过来,父级向其父级请求类,直到请求到达层次结构的顶部。如果层次结构顶部的类加载器无法满足请求,则调用它的子类加载器负责加载该类。

通过隔离类加载器,您的耳朵类加载器将不会查看父类(=JBoss / 其他 AS 类加载器)。据我所知,war 文件无法做到这一点。


KNU:ear 文件的这种使用比仅使用它更有效,因为“它包含 Servlet 类文件、JSP 文件、支持文件、GIF 和 HTML 文件”,如接受的答案中所述。由于 war 文件还可以包含 gif、html、jsp、servlet,......如果每个人都“以他的力量回答”,也许我们都可以在手头的问题上变得更聪明。
Maven为你做的不是吗?您可以为每个版本指定依赖项,它们会包含在 /lib 文件夹中。 (在战争文件中)
是的,但是应用程序服务器/servlet 容器可以选择用他在自己的 lib 文件夹中提供的库来覆盖 lib 文件夹中的这些。这可以防止这种情况。这一切都取决于使用的类加载机制。
u
user1884500

J2EE 定义了三种类型的归档:

Java 档案 (JAR) JAR 文件封装了一个或多个 Java 类、一个清单和一个描述符。 JAR 文件是最低级别的存档。 JAR 文件在 J2EE 中用于打包 EJB 和客户端 Java 应用程序。 Web 档案 (WAR) WAR 文件类似于 JAR 文件,不同之处在于它们专门用于由 Servlet、JSP 和支持类构成的 Web 应用程序。 Enterprise Archives (EAR) “EAR 文件包含构成特定 J2EE 应用程序的所有组件。


S
Saša

为了使项目传输、部署变得容易。需要压缩成一个文件。 .class 文件的 JAR(java 归档)组

WAR(网络存档)- 每个战争代表一个 Web 应用程序 - 只能使用 Web 相关技术,如 servlet、jsps 可以使用。 - 可以在 Tomcat 服务器上运行 - 仅由 web 相关技术开发的 web 应用程序 jsp servlet html js - 仅信息表示没有事务。

EAR(企业档案)——每个耳朵代表一个企业应用程序——我们可以使用来自 j2ee 的任何东西,比如 ejb,jms 可以愉快地使用。 - 可以在 Glassfish 之类的服务器上运行,而不是在 Tomcat 服务器上。 - 由任何技术开发的企业应用程序,来自 j2ee,如所有 Web 应用程序和 ejbs jms 等 - 使用信息表示进行交易。例如。银行应用程序、电信应用程序