打包成JAR文件和WAR文件,到底有什么区别?
Spring Boot是一种基于Spring框架的快速开发应用程序的工具,可以轻松地构建可部署的独立应用程序。在使用Spring Boot时,你可能会注意到有两种不同的部署选项:打包成JAR文件和WAR文件。在这篇文章中,我们将深入探讨这两种部署选项之间的差异和使用场景。
JAR和WAR文件的概述
在了解JAR和WAR文件的差异之前,让我们首先了解一下它们各自是什么。

JAR文件
JAR文件是Java Archive的缩写,它是一种用于打包Java类、资源文件和元数据的标准格式。JAR文件可以包含Java类文件、图像、HTML文件、声音文件、属性文件等各种资源文件。JAR文件通常用于打包Java应用程序,它可以将所有需要的类和资源打包到一个文件中,并通过Java虚拟机(JVM)来运行。
WAR文件
WAR文件是Web Archive的缩写,它是一种用于打包Web应用程序的标准格式。WAR文件可以包含Java类文件、JSP页面、HTML页面、CSS、JavaScript和其他Web资源文件。WAR文件通常用于将Web应用程序部署到Web服务器中。
JAR和WAR文件的区别
打包方式
JAR文件和WAR文件的打包方式是不同的。JAR文件是将所有的资源文件和Java类文件打包成一个JAR文件,而WAR文件则是将Web应用程序的所有资源文件和Java类文件打包成一个WAR文件。
部署方式
JAR文件和WAR文件的部署方式也是不同的。JAR文件可以在任何Java环境中运行,只要JVM能够识别并运行它。它可以通过java -jar命令来启动应用程序,也可以通过将JAR文件放置在Web服务器的类路径下来部署应用程序。但是,由于JAR文件不包含Web应用程序所需的Web.xml文件,所以无法直接在Web容器中部署。
WAR文件则是专门用于Web应用程序部署的,它可以直接部署在Web容器中。Web容器可以根据Web.xml文件中的配置信息来部署和管理Web应用程序。WAR文件可以通过将WAR文件复制到Web容器的Webapps目录下来部署Web应用程序。Web容器会在启动时自动解压WAR文件,并将其中的资源文件和Java类文件放置在适当的目录下。
适用场景
JAR文件和WAR文件的适用场景也是不同的。JAR文件通常用于打包独立的Java应用程序,它可以在任何Java环境中运行,而不需要任何其他的依赖关系。它适用于开发独立应用程序,如命令行工具、桌面应用程序等。由于JAR文件不包含Web.xml文件和其他Web相关的配置文件,所以不适合用于Web应用程序的部署。
WAR文件则是专门用于Web应用程序的打包和部署的。它可以包含Web应用程序的所有资源文件和Java类文件,并提供了一种标准化的部署方式。WAR文件适用于开发Web应用程序,如基于Spring Boot的Web应用程序、基于Servlet的Web应用程序等。它可以在Web容器中部署,Web容器可以根据WAR文件中的配置信息来管理和部署Web应用程序。
Spring Boot打包成JAR文件和WAR文件的区别
Spring Boot支持将应用程序打包成JAR文件和WAR文件。默认情况下,Spring Boot会将应用程序打包成JAR文件。如果需要将应用程序打包成WAR文件,则需要修改pom.xml文件,并将打包方式设置为war。
JAR文件部署
将Spring Boot应用程序打包成JAR文件后,可以通过java -jar命令来启动应用程序。当JVM启动时,它会自动查找JAR文件中的可执行类,并启动应用程序。JAR文件的部署非常简单,只需要将JAR文件复制到目标服务器上,然后在命令行中执行java -jar命令即可。
WAR文件部署
将Spring Boot应用程序打包成WAR文件后,可以将WAR文件部署到Web容器中。Web容器会在启动时自动解压WAR文件,并将其中的资源文件和Java类文件放置在适当的目录下。在Spring Boot应用程序中,需要配置一个ServletInitializer类,以便Web容器能够正确地初始化Spring Boot应用程序。ServletInitializer类继承了SpringBootServletInitializer,并重写了configure()方法,以配置Spring Boot应用程序的入口点。
JAR文件和WAR文件的优缺点
现在让我们来总结一下JAR文件和WAR文件的优缺点。
JAR文件的优点
- 部署简单。JAR文件可以在任何Java环境中运行,只需要JVM能够识别并运行它。
- 可独立运行。JAR文件包含了所有的资源文件和Java类文件,可以在任何支持Java的操作系统上运行。
- 轻量级。JAR文件通常比WAR文件小,因为它只包含应用程序所需的Java类文件和资源文件。
JAR文件的缺点
- 不适合Web应用程序。JAR文件不包含Web.xml文件和其他Web相关的配置文件,无法直接在Web容器中部署Web应用程序。
- 不支持JSP页面。JAR文件不支持JSP页面,因为JSP页面需要在Web容器中运行。
WAR文件的优点
- 适合Web应用程序。WAR文件包含了Web.xml文件和其他Web相关的配置文件,可以直接在Web容器中部署Web应用程序。
- 支持JSP页面。WAR文件可以包含JSP页面和其他Web资源文件,并可以在Web容器中运行。
WAR文件的缺点
- 部署复杂。WAR文件需要在Web容器中部署,需要配置Web容器,并且需要遵循一定的部署流程和规范。
- 依赖Web容器。WAR文件必须在支持Java Servlet规范的Web容器中运行,不适用于独立运行的Java应用程序。
- 大型文件。WAR文件通常比JAR文件大,因为它包含了大量的资源文件和配置文件。
如何选择JAR文件和WAR文件
选择JAR文件和WAR文件取决于应用程序的需求和部署环境。如果应用程序是一个独立运行的Java应用程序,没有Web相关的功能和配置,那么可以选择JAR文件。如果应用程序是一个Web应用程序,并需要在Web容器中运行,那么必须选择WAR文件。
在选择JAR文件和WAR文件时,还需要考虑应用程序的性能和可维护性。通常情况下,JAR文件的性能比WAR文件更好,因为它们不需要依赖Web容器。但是,WAR文件在部署和维护方面更加方便,因为它们包含了所有的Web相关配置文件和资源文件,并且遵循了标准化的部署流程。
如何打包Spring Boot应用程序成JAR文件和WAR文件
在Spring Boot应用程序中,可以通过修改pom.xml文件来打包应用程序成JAR文件和WAR文件。
打包成JAR文件
默认情况下,Spring Boot应用程序会被打包成JAR文件。如果需要修改JAR文件的名称和版本号,可以在pom.xml文件中添加如下配置:
<build><finalName>my-application</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.5.4</version><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins>
</build>
在执行mvn package命令时,Spring Boot会将应用程序打包成my-application.jar文件。
打包成WAR文件
如果需要将Spring Boot应用程序打包成WAR文件,可以在pom.xml文件中添加如下配置:
<packaging>war</packaging><build><finalName>my-application</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.5.4</version><executions><execution><goals><goal>repackage</goal></goals><configuration><classifier>exec-war</classifier><mainClass>com.example.Application</mainClass></configuration></execution></executions></plugin>
</plugins>
</build>
在执行mvn package命令时,Spring Boot会将应用程序打包成my-application.war文件。需要注意的是,如果应用程序依赖于一些非Web相关的依赖,比如数据库驱动程序,需要将这些依赖声明为provided,以避免将它们打包进WAR文件中。
总结
在本文中,我们介绍了Spring Boot应用程序的打包和部署方式,并讨论了JAR文件和WAR文件的优缺点。JAR文件适用于独立运行的Java应用程序,而WAR文件适用于Web应用程序。选择JAR文件和WAR文件需要根据应用程序的需求和部署环境进行决策。Spring Boot可以通过修改pom.xml文件来打包应用程序成JAR文件和WAR文件,具体方法在上文中已经详细介绍。

相关文章:
打包成JAR文件和WAR文件,到底有什么区别?
Spring Boot是一种基于Spring框架的快速开发应用程序的工具,可以轻松地构建可部署的独立应用程序。在使用Spring Boot时,你可能会注意到有两种不同的部署选项:打包成JAR文件和WAR文件。在这篇文章中,我们将深入探讨这两种部署选项…...
STM32 OTA应用开发——通过串口/RS485实现OTA升级(方式1)
STM32 OTA应用开发——通过串口/RS485实现OTA升级(方式1) 目录STM32 OTA应用开发——通过串口/RS485实现OTA升级(方式1)前言1 环境搭建2 功能描述3 程序编写3.1 BootLoader部分3.2 APP的制作4 修改工程中的内存配置4.1 Bootloader…...
在教学中常被问到的几个vue3.x与typescript的问题,统一解答
在教学当中,学生在学习vue3.x时,常常会问到typescript和vue3.x之间的关系,感觉这两个技术总是绑在一起的,下面老赵来统一解答一下: 那学vue3.x,为什么要求也要掌握typescript Vue 3.x是一个使用TypeScript编…...
纯css实现超炫酷的星空背景按钮
也是在制作项目时发现的,找了很多demo,一点一点测试,发现这个按钮也是非常的炫酷 用到了几个属性,keyframes,::after,::before 先了解一下他们分别都是干嘛的 keyframes 关键帧 keyframes at-rule 规则通过在动画序…...
openpnp - 贴片前, 放入一块新板子后, 对板子的坐标矫正
文章目录openpnp - 贴片前, 放入一块新板子后, 对板子的坐标矫正概述笔记实验前置条件实验开始建立自己板子上的Mark点封装, 用于自己人工圈定判断Mark点位置是否正确建立mark点封装根据多个mark点, 来精确定位板子左下角原点坐标ENDopenpnp - 贴片前, 放入一块新板子后, 对板子…...
计及需求响应的改进灰狼优化算法求解风、光、柴、储容量优化配置(Matlab代码实现)
👨🎓个人主页:研学社的博客💥💥💞💞欢迎来到本博客❤️❤️💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密…...
Elasticsearch使用——高级篇
1.数据聚合**聚合(aggregations)**可以让我们极其方便的实现对数据的统计、分析、运算。例如:什么品牌的手机最受欢迎?这些手机的平均价格、最高价格、最低价格?这些手机每月的销售情况如何?实现这些统计功…...
Java网络爬虫-HttpClient工具类
关于用Java进行爬虫的资料网上实在少之又少,但作为以一名对Java刚刚初窥门径建立好兴趣的学生怎么能静得下心用新学的Python去写,毕竟Java是世界上最好的语言嘛 (狗头)关于Java爬虫最受欢迎的一个框架Jsoup常常搭配HttpClient来使用,因为Jsou…...
LeetCode203_203. 移除链表元素
LeetCode203_203. 移除链表元素 一、描述 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 示例 1: 输入:head [1,2,6,3,4,5,6], val 6 输出:[1,2…...
【洛谷 P1443】马的遍历 题解(广度优先搜索)
马的遍历 题目描述 有一个 nmn \times mnm 的棋盘,在某个点 (x,y)(x, y)(x,y) 上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步。 输入格式 输入只有一行四个整数,分别为 n,m,x,yn, m, x, yn,m,x,y。 输出格式 一个 nmn \t…...
为什么gpt输出有随机性?
以下答案由chatGPT产生! 为什么gpt输出有随机性? GPT(Generative Pre-trained Transformer)是一种基于Transformer架构的神经语言模型,它是一个深度学习模型,通过在大规模文本数据上进行预训练࿰…...
配置Clion用于STM23开发(Makefile)
前言 对于Clion配置STM32开发环境的教程在网上一搜一大堆,但是大部分都是22年之前的,使用的方法都是在STM32CubeMX生成SW4STM32工程。但是在22年不知道哪个版本后,CubeMX已经不再支持生成SW4STM32工程了,这也是我本人遇到的问题。…...
如何在 Istio 中使用 SkyWalking 进行分布式追踪
在云原生应用中,一次请求往往需要经过一系列的 API 或后台服务处理才能完成,这些服务有些是并行的,有些是串行的,而且位于不同的平台或节点。那么如何确定一次调用的经过的服务路径和节点以帮助我们进行问题排查?这时候…...
HBase高手之路1-Hbase简介
文章目录HBase高手之路1-Hbase简介一、什么是HBase1. HBase简介2. HBase的发展过程二、HBase特点1. 海量存储2. 列式存储3. 极易扩展4. 高并发5. 稀疏6. 强一致性读/写7. 自动分块8. 自动RegionServer故障转移9. Hadoop/HDFS集成10. MapReduce11. Java Client API12. Thrift/RE…...
计算机视觉手指甲标注案例
关键点标注是指识别和标注图像或视频中特定的相关点或区域的过程。在机器学习行业,它经常被用来训练计算机视觉模型,以执行诸如物体检测、分割和跟踪等任务。 关键点注释可用于以下应用: 面部关键点检测:识别图像中人脸上的眼睛…...
linux 字符串截取(cut)
-b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。 -c :以字符为单位进行分割。 -d :自定义分隔符,默认为制表符。 -f :与-d一起使用,指定显示哪个区域。 -n…...
003+limou+HTML——(3)HTML列表
000、前言 列表是网页常见的一种数据排列方式,在HTMl中列表一共有三种:有序列表、无序列表、定义列表(另外“目录列表dir”和“菜单列表menu”已经在HTML5中被废除了,现在都是使用无序列表ul来替代) 001、有序列表&a…...
设计模式---工厂模式
目录 1. 简单工厂模式 2. 工厂方法模式 1. 简单工厂模式 简单工厂模式(Simple Factory Patterm)又称为静态工厂方法模式(Static Factory Model),它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义了一…...
C++基础了解-13-C++ 数组
C 数组 一、C 数组 C 支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量。 数组的声明并不是声明一个个单独的变量,比如 number0、number1、…、number9…...
ICC2:限制LVT比例
1) 禁用VT 在优化过程用,如果要禁用某种VT可以直接对其使用dont use,如下示例: set_attribute -objects [get_lib_cells *_lvt*/*] -name dont_use -value true 在dont use lib cell的基础上还可以对某些模块放开lvt的使用。 set_app_options -name …...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
面试高频问题
文章目录 🚀 消息队列核心技术揭秘:从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"?性能背后的秘密1.1 顺序写入与零拷贝:性能的双引擎1.2 分区并行:数据的"八车道高速公路"1.3 页缓存与批量处理…...
【iOS】 Block再学习
iOS Block再学习 文章目录 iOS Block再学习前言Block的三种类型__ NSGlobalBlock____ NSMallocBlock____ NSStackBlock__小结 Block底层分析Block的结构捕获自由变量捕获全局(静态)变量捕获静态变量__block修饰符forwarding指针 Block的copy时机block作为函数返回值将block赋给…...
React父子组件通信:Props怎么用?如何从父组件向子组件传递数据?
系列回顾: 在上一篇《React核心概念:State是什么?》中,我们学习了如何使用useState让一个组件拥有自己的内部数据(State),并通过一个计数器案例,实现了组件的自我更新。这很棒&#…...
