SpringBoot项目在进行部署打包的时候,打包成jar和war有何差异?
首先给大家来讲一个我们遇到的一个奇怪的问题:
我的一个springboot项目,用mvn install打包成jar,换一台有jdk的机器就直接可以用java -jar 项目名.jar的方式运行,没任何问题,为什么这里不需要tomcat也可以运行了?
然后我打包成war放进tomcat运行,发现端口号变成tomcat默认的8080(我在server.port中设置端口8090)项目名称也必须加上了。
也就是说我在原来的机器的IDEA中运行,项目接口地址为 ip:8090/listall,打包放进另一台机器的tomcat就变成了ip:8080/项目名/listall。这又是为什么呢?
通过jar运行实际上是启动了内置的tomcat,所以用的是应用的配置文件中的端口
直接部署到tomcat之后,内置的tomcat就不会启用,所以相关配置就以安装的tomcat为准,与应用的配置文件就没有关系了
哎,现在学编程的基本都不会教历史了,也没人有兴趣去钻研。
总体来说吧,很多年前,Sun 还在世的那个年代,在度过了早期用 C++写 Html 解析器的蛮荒时期后,有一批最早的脚本程序进入了 cgi 时代,此时的 Sun 决定进军这个领域,为了以示区别并显得自己高大上,于是研发了 servlet 标准,搞出了最早的 jsp。并给自己起了个高大上的称号 JavaEE ( Java 企业级应用标准,其实不就是一堆服务器以 http 提供服务吗,吹逼)。
既然是企业级标准那自然得有自己的服务器标准。于是 Servlet 标准诞生,以此标准实现的服务器称为 Servle 容器服务器,Tomcat 就是其中代表,被 Sun 捐献给了 Apache 基金会,那个时候的 Web 服务器还是个高大上的概念,当时的 Java Web 程序的标准就是 War 包(其实就是个 Zip 包),这就是 War 包的由来。
后来随着服务器领域的屡次进化,人们发现我们为什么要这么笨重的 Web 服务器,还要实现一大堆 Servlet 之外的管理功能,简化一下抽出核心概念 servlet 不是更好吗,最早这么干的似乎是 Jetty,出现了可以内嵌的 Servelet 服务器。
去掉了一大堆非核心功能。后来 tomcat 也跟进了,再后来,本来很笨重的传统 JavaEE 服务器 Jboss 也搞了个 undertow 来凑热闹。正好这个时候微服务的概念兴起,“ use Jar,not War ”。要求淘汰传统 Servlet 服务器的呼声就起来了。
jar包和war包的区别
1、war是一个web模块,其中需要包括WEB-INF,是可以直接运行的WEB模块;jar一般只是包括一些class文件,在声明了Main_class之后是可以用java命令运行的。
2、war包是做好一个web应用后,通常是网站,打成包部署到容器中;jar包通常是开发时要引用通用类,打成包便于存放管理。
3、war是Sun提出的一种Web应用程序格式,也是许多文件的一个压缩包。这个包中的文件按一定目录结构来组织;classes目录下则包含编译好的Servlet类和Jsp或Servlet所依赖的其它类(如JavaBean)可以打包成jar放到WEB-INF下的lib目录下。
JAR文件格式以流行的ZIP文件格式为基础。与ZIP文件不同的是,JAR 文件不仅用于压缩和发布,而且还用于部署和封装库、组件和插件程序,并可被像编译器和 JVM 这样的工具直接使用。
【格式特点】:
安全性 可以对 JAR 文件内容加上数字化签名。这样,能够识别签名的工具就可以有选择地为您授予软件安全特权,这是其他文件做不到的,它还可以检测代码是否被篡改过。
减少下载时间 如果一个 applet 捆绑到一个 JAR 文件中,那么浏览器就可以在一个 HTTP 事务中下载这个 applet 的类文件和相关的资源,而不是对每一个文件打开一个新连接。
压缩 JAR 格式允许您压缩文件以提高存储效率。
传输平台扩展 Java 扩展框架(Java Extensions Framework)提供了向 Java 核心平台添加功能的方法,这些扩展是用 JAR 文件打包的(Java 3D 和 JavaMail 就是由 Sun 开发的扩展例子)。
WAR文件就是一个Web应用程序,建立WAR文件,就是把整个Web应用程序(不包括Web应用程序层次结构的根目录)压缩起来,指定一个war扩展名。
【建立的条件】:
需要建立正确的Web应用程序的目录层次结构。
建立WEB-INF子目录,并在该目录下建立classes与lib两个子目录。
将Servlet类文件放到WEB-INF\classes目录下,将Web应用程序所使用Java类库文件(即JAR文件)放到WEB-INF\lib目录下。
将JSP页面或静态HTML页面放到上下文根路径下或其子目录下。
建立META-INF目录,并在该目录下建立context.xml文件。
下面给大家讲讲怎么将springboot项目打包成jar和war
SpringBoot项目打包成jar很简单,也是SpringBoot的常用打包格式;本篇博客将SpringBoot打包成jar和war两种方式都记录下来;
先介绍将SpringBoot打包成jar包的方式:(以下示例是在idea中演示)
一、打包成jar
1)先new 一个Spring Starter Project
图片
这里注意packaging默认为jar,不用修改.
2)创建完成后项目的pom如下:
<?xml version="1.0" encoding="UTF-8"?>
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.1.4.RELEASE
com.example
demo
0.0.1-SNAPSHOT
demo
Demo project for Spring Boot
在Terminal窗口,使用 mvn clean package 命令打包:
图片
然后在target目录下就能看到打包好的jar包了
图片
二、打包成war包形式
1)可以在刚才创建的项目上做改动,首先打包成war需要一个ServletInitializer类,这个类的位置需要和启动类在同一个文件下
图片
如果一开始选择war包形式,会自动创建此类
2)修改pom.xml
修改pom.xml的war将原先的jar改为war;
3)如果我们的SpringBoot是使用html作为前端页面开发没有问题,但是如果我们想用jsp开发,这个时候就需要配置一些依赖了:主要是排除SpringBoot的内置Tomcat,添加javax.servlet-api和tomcat-servlet-api(SpringMVC还需要配置后缀);
最后的pom.xml如下:
<?xml version="1.0" encoding="UTF-8"?>
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.1.4.RELEASE
com.example
demo
0.0.1-SNAPSHOT
war
demo
Demo project for Spring Boot
<dependency><groupId>org.apache.tomcat</groupId><artifactId>tomcat-servlet-api</artifactId><version>8.0.36</version><scope>provided</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><scope>provided</scope></dependency>
org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-maven-plugin 因为SpringBoot默认推荐的是html,而不是jsp;经过上面的修改就可以使用jsp进行开发了;
4)打包成war:使用mvn clean package
如下:
图片
打包成功后,就可以将war包放在tomcat下的webapps下,然后运行tomcat,启动项目了;
记录下来,以后用到的时候看 _;
当然了,在创建项目的时候直接选择package为war,直接就能打成war包了
当选择war为打包方式创建项目时,ServletInitializer是默认直接创建的
图片
此时,pom文件如下
<?xml version="1.0" encoding="UTF-8"?>
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.1.4.RELEASE
com.example
demo
0.0.1-SNAPSHOT
war
demo
Demo project for Spring Boot
相关文章:
SpringBoot项目在进行部署打包的时候,打包成jar和war有何差异?
首先给大家来讲一个我们遇到的一个奇怪的问题: 我的一个springboot项目,用mvn install打包成jar,换一台有jdk的机器就直接可以用java -jar 项目名.jar的方式运行,没任何问题,为什么这里不需要tomcat也可以运行了? 然…...

ARM系列 -- 虚拟化(四)
今天来看看虚拟中断。 在一个非虚拟化的系统中,操作系统可以直接访问GIC的寄存器,并且处理GIC的物理中断接口(physical interrupt interface)。 但是在一个虚拟化的系统中,不是这样。Guest OS并不知道它运行在虚拟系…...

QT GUI编程常用控件学习
1 GUI编程应该学什么 2 QT常用模块结构 QtCore: 包含了核心的非GUI的功能。主要和时间、文件与文件夹、各种数据、流、URLs、mime类文件、进程与线程一起使用 QtGui: 包含了窗口系统、事件处理、2D图像、基本绘画、字体和文字类 QtWidgets: 包含了一些列创建桌面应用的UI元素…...

【Python从入门到进阶】49、当当网Scrapy项目实战(二)
接上篇《48、当当网Scrapy项目实战(一)》 上一篇我们正式开启了一个Scrapy爬虫项目的实战,对当当网进行剖析和抓取。本篇我们继续编写该当当网的项目,讲解刚刚编写的Spider与item之间的关系,以及如何使用itemÿ…...
flutter build ipa 打包比 xcode archive 打出的ipa包大
为什么 flutter build ipa 打包比 xcode archive 打出的ipa包大? 如果你用Flutter构建的.ipa文件比通过Xcode Archive构建的.ipa文件要大,这可能是因为Flutter构建了一个包含了多平台的二进制文件的通用包。这意味着在Flutter构建的.ipa中包含了所有的C…...

B端系统:巧妙地容错和防错设置,减少用户操作错误
Hi,大家好,我是大美B端工场,从事8年前端开发的老司机。很多B端系统体验不好,让用户非常茫然或者容易出错,大大降低了操作体验,本文着重分析B端系统的容错机制该如何设计,欢迎老铁们关注、评论、…...

BIO实战、NIO编程与直接内存、零拷贝深入辨析
BIO实战、NIO编程与直接内存、零拷贝深入辨析 长连接、短连接 长连接 socket连接后不管是否使用都会保持连接状态多用于操作频繁,点对点的通讯,避免频繁socket创建造成资源浪费,比如TCP 短连接 socket连接后发送完数据后就断开早期的http服…...

PDF文件转换为图片
现在确实有很多线上的工具可以把pdf文件转为图片,比如smallpdf等等,都很好用。但我们有时会碰到一些敏感数据,或者要批量去转,那么需要自己写脚本来实现,以下脚本可以提供这个功能~ def pdf2img(pdf_dir, result_path…...

【Java程序设计】【C00317】基于Springboot的智慧社区居家养老健康管理系统(有论文)
基于Springboot的智慧社区居家养老健康管理系统(有论文) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的智慧社区居家养老健康管理系统设计与实现,本系统有管理员、社区工作人员、医生以及家属四种角色权限 管…...

Vue3前端实现一个本地消息队列(MQ), 让消息延迟消费或者做缓存
MQ功能实现的具体代码(TsMQ.ts): import { v4 as uuidx } from uuid;import emitter from /utils/mitt// 消息类 class Message {// 过期时间,0表示马上就消费exp: number;// 消费标识,避免重复消费tag : string;// 消息体body : any;constr…...

普中51单片机学习(8*8LED点阵)
8*8LED点阵 实验代码 #include "reg52.h" #include "intrins.h"typedef unsigned int u16; typedef unsigned char u8; u8 lednum0x80;sbit SHCPP3^6; sbit SERP3^4; sbit STCPP3^5;void HC595SENDBYTE(u8 dat) {u8 a;SHCP1;STCP1;for(a0;a<8;a){SERd…...

Python 实现Excel自动化办公(上)
在Python 中你要针对某个对象进行操作,是需要安装与其对应的第三方库的,这里对于Excel 也不例外,它也有对应的第三方库,即xlrd 库。 什么是xlrd库 Python 操作Excel 主要用到xlrd和xlwt这两个库,即xlrd是读Excel &am…...
DayDreamInGIS 之 ArcGIS Pro二次开发 图层属性中换行符等特殊字符替换
具体参考ArcMap中类似的问题,本帖开发一个ArcGISPro版的工具 1.基础库部分 插件开发,经常需要处理图层与界面的交互。基础库把常用的交互部分做了封装,方便之后的重复使用。 (1)下述类定义了数据存储结构࿰…...

RK3568平台 RTC时间框架
一.RTC时间框架概述 RTC(Real Time Clock)是一种用于计时的模块,可以是再soc内部,也可以是外部模块。对于soc内部的RTC,只需要读取寄存器即可,对于外部模块的RTC,一般需要使用到I2C接口进行读取…...

番外篇 | YOLOv5+DeepSort实现行人目标跟踪检测
前言:Hello大家好,我是小哥谈。DeepSort是一种用于目标跟踪的深度学习算法。它结合了目标检测和目标跟踪的技术,能够在视频中准确地跟踪多个目标,并为每个目标分配一个唯一的ID。DeepSort的核心思想是将目标检测和目标跟踪两个任务进行联合训练,以提高跟踪的准确性和稳定性…...
认识Sass
sass中文文档: Sass: Sass 文档 1. sass的安装步骤 1. 卸载冲突的Node.js (1) winR输入control,找到电脑上的卸载软件,找到Node.js,右键”卸载” (2) winR输入cmd,输入命令:node -v查看结果。 如果提示: node 不…...

YOLOv9-Openvino和ONNXRuntime推理【CPU】
1 环境: CPU:i5-12500 Python:3.8.18 2 安装Openvino和ONNXRuntime 2.1 Openvino简介 Openvino是由Intel开发的专门用于优化和部署人工智能推理的半开源的工具包,主要用于对深度推理做优化。 Openvino内部集成了Opencv、Tens…...
AIGC 架构:RAG (retrieval augumented generation) 应用可以使用 PostgreSQL 作为向量数据库组件吗?
是的,RAG(检索增强生成)应用程序可以绝对地使用 PostgreSQL 作为向量数据库!事实上,它是一个流行的选择,因为有以下几个优点: 使用 PostgreSQL 和 pgvector 的优点: 集成解决方案&…...

leetcode:134.加油站
解题思路:需要注意开始时的编号,有的可以走一圈,有的走不了 模拟过程:for循环主要是用来模拟线性的过程,而在这里它是环状的; 可以用暴力解法,但是在这里我用贪心来解决。 常见疑惑࿱…...

uniapp的微信小程序授权头像昵称(最新版)
前面我出过两期博客关于小程序授权登录,利用php实现一个简单的小程序授权登录并存储授权用户信息到数据库的完整流程。无奈,小程序官方又整幺蛾子了。wx.getUserInfo接口收回,wx.getUserProfile接口也不让用。导致我的个人小程序:梦缘 的授权…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋
随着工业以太网的发展,其高效、便捷、协议开放、易于冗余等诸多优点,被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口,具有实时性、开放性,使用TCP/IP和IT标准,符合基于工业以太网的…...

rknn toolkit2搭建和推理
安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 ,不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源(最常用) conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...