Jar包和War包的区别以及如何选择
🤟致敬读者
- 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉
📘博主相关
- 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息
文章目录
- Java打包-Jar和War两种方式的区别与选择
- 1. 小作文
- 2. 正文内容
- 2.1 核心要点
- 2.2 详细对比
- 2.3 内部结构图示
- JAR包结构示例(一个简单的工具库)
- WAR包结构示例(一个标准的Web应用)
- 2.4 现代开发中的演进(非常重要!)
- 2.5 总结与如何选择
📃文章前言
- 🔷文章均为学习工作中整理的笔记。
- 🔶如有错误请指正,共同学习进步。
Java打包-Jar和War两种方式的区别与选择
1. 小作文
不知道多久没有创建新的Java项目了,在重装系统后,安装了最新的开发工具(新版的JDK和新版的IDEA以及新版的Maven),创建了一个Java的springboot项目。
如下:
在红框位置,我迟疑了一下,这两个我该选哪个,默认是Jar,直觉告诉我应该默认就行了,但理性让我想知道另一个可不可以选,两者到底有什么区别。
似乎很久之前就学习过这两个东西,只是过了太久,记忆已经模糊了。
今天我们就来好好了解一下他俩的区别,以及在什么场景下该选择哪种打包方式。
2. 正文内容
2.1 核心要点
- JAR包:Java ARchive,是Java的通用打包格式。它就像是一个压缩文件,将多个Java类文件、资源文件和相关元数据打包成一个文件。主要用于封装库、组件或独立应用程序。
- WAR包:Web Application ARchive,是专门为Web应用程序设计的打包格式。它也是一个压缩文件,但内部结构遵循特定的Java Web应用标准,用于部署到Servlet容器(如Tomcat、Jetty)或Web服务器。
2.2 详细对比
特性 | JAR包 | WAR包 |
---|---|---|
全称 | Java ARchive | Web Application ARchive |
用途 | 打包类库、工具或独立应用(如Swing应用、Spring Boot应用)。 | 打包动态Web应用(如基于Servlet/JSP的网站)。 |
运行环境 | JVM。可执行JAR通过 java -jar 命令直接运行。 | Servlet容器/Web服务器(如Tomcat, Jetty, WebLogic)。 |
内部结构 | 相对自由,但通常包含: |
.class
文件- 资源文件(如
.properties
) META-INF/MANIFEST.MF
(清单文件) | 有严格的目录结构(遵循Servlet规范):/WEB-INF/web.xml
(部署描述符,可选的)/WEB-INF/classes/
(存放编译后的.class文件)/WEB-INF/lib/
(存放应用依赖的JAR包)- 静态资源(如
.html
,.jsp
,.css
, 图片,位于根目录或其它目录) |
| 打包工具 | JDK自带的jar
命令,或Maven/Gradle等构建工具。 | Maven/Gradle等构建工具(通过配置打包类型为war
)。 |
| 可执行性 | 可以。通过配置MANIFEST.MF
文件中的Main-Class
属性,可以创建可执行的JAR。 | 不可以。WAR包本身不能直接运行,必须部署到Servlet容器中,由容器来加载和执行。 |
| 依赖管理 | 通常不包含其依赖的第三方库。需要用户自行将依赖库添加到类路径(Classpath)中。 | 包含其依赖的第三方库,这些库都放在/WEB-INF/lib/
目录下,容器会自动加载。 |
| 比喻 | 一个工具箱或一个独立的可执行程序。 | 一个家具齐全的样板间,需要放到一栋大楼(Servlet容器) 里才能使用。 |
2.3 内部结构图示
JAR包结构示例(一个简单的工具库)
my-app.jar
│
├── com/
│ └── example/
│ └── util/
│ ├── StringUtils.class
│ └── DateUtils.class
├── application.properties
└── META-INF/└── MANIFEST.MF (指定版本、主类等信息)
WAR包结构示例(一个标准的Web应用)
my-webapp.war
│
├── index.html
├── login.jsp
├── css/
│ └── style.css
├── images/
│ └── logo.png
└── WEB-INF/├── web.xml (Servlet、Filter等配置)├── classes/│ └── com/│ └── example/│ └── controller/│ └── LoginServlet.class└── lib/├── spring-webmvc-5.x.x.jar├── jdbc-driver.jar└── ... (其他依赖JAR)
2.4 现代开发中的演进(非常重要!)
随着Spring Boot等现代框架的兴起,传统的JAR/WAR界限变得有些模糊。
-
Spring Boot的可执行JAR:
Spring Boot创造性地将传统的WAR包概念融入了JAR包中。它创建了一种可执行的、内嵌了Servlet容器(如Tomcat)的JAR包。- 结构:这种JAR包内部不再是简单的类文件,而是包含:
BOOT-INF/classes/
:存放你自己的应用代码。BOOT-INF/lib/
:存放你应用的所有依赖(包括内嵌的Tomcat!)。org/springframework/boot/loader/
:Spring Boot的类加载器,用于从这个特殊的JAR结构中加载类和资源。
- 运行方式:你仍然使用
java -jar my-springboot-app.jar
来运行它。它会自动启动内嵌的Tomcat并部署你的应用。 - 优势:实现了应用的独立和自包含,简化了部署流程,非常适合微服务和云原生架构。
- 结构:这种JAR包内部不再是简单的类文件,而是包含:
-
WAR包的持续存在:
虽然可执行JAR很流行,但WAR包在传统企业环境中依然重要。当你需要将应用部署到已有的、由运维团队管理的Tomcat、WebLogic或WebSphere集群时,打包成WAR仍然是标准做法。
2.5 总结与如何选择
场景 | 应选择的包类型 |
---|---|
开发一个工具库或公共组件,供其他Java项目使用。 | JAR |
开发一个传统的、基于Servlet/JSP的Web应用,并部署到独立的Tomcat等服务器。 | WAR |
开发一个Spring Boot应用,并且希望它独立运行(使用内嵌服务器)。 | 可执行JAR (Spring Boot默认) |
开发一个Spring Boot应用,但需要部署到已有的、外部的Tomcat/JBoss。 | WAR (需要将Spring Boot的打包方式改为war ,并排除内嵌容器) |
简单来说:
- 想做库或者独立运行的桌面/命令行应用 -> JAR
- 想做传统Web应用 -> WAR
- 想做现代Spring Boot微服务(自带服务器) -> 可执行JAR
- 想做现代Spring Boot应用(部署到外部服务器) -> WAR
📜文末寄语
- 🟠关注我,解锁更多优质内容
- 🟡技术前沿 | 实战干货 | 疑难解答,持续更新中
- 🟢加入《全栈知识库》,与各领域开发者共创技术盛宴
- 🔵进入《专属社群》,技术路上结伴同行,共同成长
- 🟣点击下方名片,获取更多精彩内容👇