Java项目打包时有两种方式:jar
和war
,这两种方式有以下区别
1.概念
jar包
全称java archive
,即java归档文件,是一种平台无关的文件格式(可以理解为一种压缩包)。
JAR 文件通常用于存储 Java 类文件、关联的元数据和资源(如文本、图片等)。它们可以用作 Java 库(用于其他项目)或可执行的独立应用程序。JAR 文件可以直接通过 Java 命令(java -jar myapp.jar
)执行,前提是 JAR 文件包含一个 Main-Class
清单属性,指示 JVM 如何启动应用程序。
war包
war包是一个可以直接运行的web模块,通常用于网站。开发web项目时会使用webapp文件夹,这个文件夹放在tomcat的webapps下就可以启动该项目了,war包就是对这个文件夹打包。
war文件包含 Java 类文件、资源文件、JSP 文件、HTML 文件、JavaScript 文件、CSS 文件、图像文件等。war 文件需要部署在支持 Java Servlet 规范的容器(如 Tomcat、Jetty、WebSphere 等)中,以便 Web 应用程序可以在 Web 服务器上运行。
简单的来说,jar 只是类的归档文件,而 war 包是一个完整的 web 应用程序。
2.文件结构
jar
jar 文件的结构简单,通常包含类文件、资源文件和清单文件(META-INF/MANIFEST.MF
)。清单文件可以包含元数据,如 Main-Class
属性,指示 JVM 应用程序的入口点。
war
WAR 文件具有更严格的目录结构,根据 Java Servlet 规范组织。
以下是标准 WAR 文件的目录结构:
├── WEB-INF
│ ├── classes
│ │ └── (Java 类文件)
│ ├── lib
│ │ └── (JAR 库文件)
│ ├── web.xml (部署描述符)
│ └── …
├── (JSP, HTML, CSS, JS 等静态资源和其他资源文件)
└── …
在这个结构中,WEB-INF
目录是特定于 Web 应用程序的,包含 Java 类文件、库文件和部署描述符(web.xml
)。部署描述符定义了应用程序的配置、Servlet 映射、监听器等。
3.部署
- Spring项目对普通无web的独立spring项目打包成jar即可;有web需求则打包成war,运行在外部servlet容器
- SpringMVC项目基于web的java应用程序,需要部署到外部servlet容器,显然要用war方式
- SpringBoot项目SpringBoot内置了Servlet容器(默认为tomcat),所以可以打包成jar直接运行
- SpringCloud通常采用微服务架构,这意味着项目中的各个模块是独立的服务。在这种情况下,一般将模块打包成 jar,有以下优点:
- 可以利用SpringBoot内置的servlet容器简化部署和运行过程;
- 方便微服务各模块间相互独立的部署和扩展;
- 方便应用程序容器化(如Docker),因为jar可以直接在容器中运行;
- 云原生支持:许多云平台(如 AWS、Azure 和 Google Cloud)为 jar文件提供了原生支持,方便部署、管理和扩展微服务