Java 归档文件格式

JAR、WAR、EAR

JAR

JAR (Java Archive) 是一种基于 Zip 的归档包文件格式,通常用于将许多 Java 类文件以及关联的元数据和资源(文本,图像等)聚合到一个文件中以进行分发。其文件拓展名为:.jar

所以可以通过 JDK 的 jar 命令创建或提取 JAR 文件,也可以使用 zip 解压缩工具。

JAR 文件,可以作为完整的一个应用程序存在,也可以作为单独的某个功能被其它应用程序使用。

打包命令:

1
$ jar cf test.jar A.class B.class

解包命令:

1
$ jar xf test.jar

JAR 作为应用存在时,可以通过 java -jar 命令运行:

  1. 如果定义了 JAR 包的 Main Class
    1
    $ java -jar test.jar
  2. 如果没有定义 JAR 包的 Main Class
    1
    $ java -cp test.jar com.test.App
  3. 在 JAR 包中,内嵌 Tomcat 或 Jetty
    1
    $ java -jar test.jar

WAR

WAR (Web Application Archive) 是一种特殊的 JAR 文件格式,是用于分发 JAR 文件,JSP(Java Server Pages),Java 类,XML 文件,静态网页(HTML 和相关文件)以及共同构成 Web 应用程序的其他资源。其文件拓展名为:.war

WAR 文件中有特殊文件和目录,WAR 文件中的 /WEB-INF 目录包含一个名为 web.xml 的文件,该文件定义了 Web 应用程序的结构。如果 Web 应用程序仅提供 JSP 文件,则可以不用 web.xml 文件。如果 Web 应用程序使用 Servlet,则 Servlet 容器使用 web.xml 确定 URL 请求将路由到哪个 Servlet。web.xml文件还用于定义可在 Servlet 中引用的上下文变量,并用于定义环境依赖。

打包命令:

1
jar -cvf web.war xxx/

解包命令:

1
jar -xf web.war

WAR 包要搭配 Tomcat 或 Jetty 这类实现了容器的应用服务器启动:

  1. 默认配置,放置在 /webapps 目录中,启动服务器
  2. 在 WAR 包中,内嵌 Tomcat 或 Jetty
    1
    $ java -jar web.war

EAR

EAR(Enterprise Application Archive)是一种特殊的 JAR 文件格式,是 Java EE 用于将一个或多个模块打包到单个存档中的文件格式,以便同时将各种模块部署到应用服务器上。其文件拓展名为:.ear

EAR 文件,与 WAR 包类似,本身也是具有特殊结构的 JAR 文件,只是包含的东西更多,其中包含一个或多个表示应用程序的模块(JAR、WAR),以及名为 /META-INF 的元数据目录,包含一个或多个部署描述符(application.xml)。

打包命令:

1
jar cf application.ear application.war application.jar META-INF\application.xml 

解包命令:

1
jar xf application.ear -C ./

META-INF/application.xml 示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<!DOCTYPE application PUBLIC '-//Sun Microsystems, Inc.//DTD J2EE Application 1.2//EN' 'http://java.sun.com/j2ee/dtds/application_1_2.dtd'>
<application>
<display-name>estore</display-name>
<description>Application description</description>
<module>
<ejb>customerEjb.jar</ejb>
</module>
<module>
<ejb>inventoryEjb.jar</ejb>
</module>
<module>
<ejb>shoppingcartEjb.jar</ejb>
</module>
<module>
<web>
<web-uri>petstore.war</web-uri>
<context-root>estore</context-root>
</web>
</module>
<security-role>
<description>the gold customer role</description>
<role-name>gold_customer</role-name>
</security-role>
<security-role>
<description>the customer role</description>
<role-name>customer</role-name>
</security-role>
<security-role>
<role-name>administrator</role-name>
</security-role>
</application>

总结

  1. JAR 是基于 Zip 的归档包文件格式,而 WAR 和 EAR 则基于 JAR 的方式
  2. 通常的使用方式:
    • JAR: 把开发时要引用的通用类及资源做封装,打成包后便于管理和使用
    • WAR: 一个完整的 Web 应用,通常是网站或 Web 平台,打成包部署到容器中
    • EAR: 企业级应用,实际上 EAR 包中包含 WAR 包和几个企业级项目的配置文件,通常是 EJB 打成 EAR 包

参考文献