springboot 项目jar命令更新war包

本文介绍了一种在不重启应用服务器的情况下更新WAR文件中特定Class或JAR包的方法。通过覆盖文件并重新打包WAR文件,可以实现快速更新,适用于需要频繁修改的应用场景。

war 已经部署需要跟新某个class或者jar包

将要更新的文件或jar放到当前war解压的对应目录结构下

执行下面操作:

 chmod 666 META-INF/*
 mv META-INF/war-tracker META-INF/war-trackerback
 jar -cvf test.war *
 jar -uvfm  test.war  META-INF/MANIFEST.MF

把新生成的war替换原来的war即可

<think>我们正在讨论Spring Boot项目jarwar的区别。根据引用资料,我们可以总结如下: 1. **打结构差异**: - **Jar**:可执行的独立JAR文件,含所有依赖(括内嵌Tomcat)和应用程序类,可以直接通过`java -jar`命令运行。 - **War**:Web应用归档文件,用于部署到外部Servlet容器(如Tomcat、Jetty等),不含内嵌容器(通过`<scope>provided</scope>`排除)。 2. **运行方式**: - Jar:使用内嵌服务器运行,启动命令为`java -jar your-app.jar`。 - War:需要部署到外部Servlet容器(如将war文件放入Tomcat的`webapps`目录)。 3. **配置差异**: - 打War时需要: - 排除内嵌Tomcat(通过`<scope>provided</scope>`或`<exclusion>`) - 创建入口类继承`SpringBootServletInitializer`并重写`configure`方法(引用[2]和[5]) - 打Jar则无需额外配置(默认方式)。 4. **配置文件的生效情况**: - 在War部署时,应用配置文件中关于服务器端口等设置可能由外部容器管理而失效(引用[2])。 5. **适用场景**: - Jar:适合微服务、云原生部署,独立运行。 - War:适合需要部署到现有Servlet容器的传统企业环境。 6. **文件结构**: - War含WEB-INF目录等标准Web应用结构(引用[3])。 - Jar使用Spring Boot的独特打结构(BOOT-INF等)。 7. **Spring Boot官方推荐**: - 默认支持并推荐使用可执行Jar方式(引用[4])。 现在,我们可以按照以下结构组织回答: ### Spring BootJarWar的核心区别 #### 1.结构与内容 | 特征 | Jar | War | |--------------|-------------------------------|--------------------------------| | **含内容** | 应用代码+所有依赖+内嵌服务器 | 应用代码+依赖(不含服务器) | | **结构特点** | BOOT-INF/classes, BOOT-INF/lib | 标准WEB-INF/classes, WEB-INF/lib | #### 2. 运行机制对比 - **Jar**: - 内嵌Tomcat/Jetty服务器,直接通过`java -jar`启动 - 独立进程运行,无需外部容器 - **War**: - 必须部署到外部Servlet容器(如Tomcat) - 容器负责加载应用,此时: - 应用的`server.port`配置失效(使用容器端口)[^2] - 需通过继承`SpringBootServletInitializer`提供容器入口 #### 3. 配置差异(关键代码) **War必要配置**: ```xml <!-- 排除内嵌Tomcat --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> <!-- 或使用exclusions --> </dependency> ``` ```java // 入口类调整 @SpringBootApplication public class Application extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { return builder.sources(Application.class); } public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` #### 4. 适用场景分析 - **选择Jar当**: - 需要独立运行的微服务架构 - 云原生部署(Docker/K8s) - 快速启动的开发测试环境 - **选择War当**: - 部署到已有Tomcat集群的企业环境 - 与其他传统JavaWeb应用共存 #### 5. 性能与维护考量 - **Jar优势**: - 部署简单(单文件) - 资源占用可控(内嵌容器优化) - **War优势**: - 利用容器集群管理能力(如Tomcat连接池共享) - 符合传统运维规范 > **设计哲学差异**:Spring BootJar设计体现了"约定大于配置"原则,而War部署则是向传统JavaEE规范的兼容[^4]。 §§相关问题§§ 1. Spring Boot应用打War时,如何解决内嵌服务器与外部容器的端口冲突? 2. 在云原生环境下,Jar部署有哪些最佳实践? 3. 如何为同一个Spring Boot项目同时支持JarWar两种打方式? 4. War部署时,Tomcat容器的版本兼容性如何判断? 5. 为什么Spring Boot官方更推荐使用可执行Jar? </think>### Spring BootJarWar的核心区别 #### 1. **运行机制与部署方式** | 特性 | Jar | War | |--------------|-------------------------------|--------------------------------| | **运行方式** | 内嵌服务器(Tomcat/Jetty)独立运行 | 需部署到外部Servlet容器(如Tomcat) | | **启动命令** | `java -jar xxx.jar` | 放入容器`webapps`目录自动部署 | | **适用场景** | 微服务、云原生部署 | 传统Java EE服务器环境 | #### 2. **打结构与内容差异 ```bash # JAR结构示例 BOOT-INF/ ├── classes/ # 应用类文件 ├── lib/ # 所有依赖库(含内嵌Tomcat) META-INF/ └── MANIFEST.MF # 启动类声明 # WAR结构示例 WEB-INF/ ├── classes/ # 应用类文件 ├── lib/ # 业务依赖(不含服务器) META-INF/ └── web.xml # Web配置 ``` - **Jar**:含**完整依赖链**(含内嵌Tomcat),通过`MANIFEST.MF`指定`Main-Class`启动[^1] - **War**:排除服务器依赖(通过`<scope>provided</scope>`),依赖容器提供运行时环境[^5] #### 3. **配置差异** **打War必需的配置调整**: 1. 排除内嵌Tomcat(二选一): ```xml <!-- 方式1:scope=provided --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> <!-- 方式2:exclusion排除 --> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> ``` 2. 继承`SpringBootServletInitializer`: ```java public class Application extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { return builder.sources(Application.class); // 容器入口 } } ``` #### 4. **配置生效范围** - **Jar**:`application.yml`中的端口(`server.port`)等配置直接生效 - **War**:端口等配置由**外部容器管理**,应用配置可能失效[^2] - **路径差异**:Jar默认根路径(`/`),War路径受容器`context-path`影响 #### 5. **优缺点对比** | **维度** | Jar优势 | War适用场景 | |----------------|-------------------------------|-------------------------------| | 部署复杂度 | ⭐⭐⭐ 单文件部署 | ⭐⭐ 需容器安装配置 | | 启动速度 | ⭐⭐⭐ 秒级启动 | ⭐⭐ 依赖容器初始化速度 | | 资源占用 | ⭐⭐ 含服务器(约+20MB) | ⭐⭐⭐ 更轻量 | | 企业运维兼容性 | ⭐ 需适应新范式 | ⭐⭐⭐ 符合传统Java EE规范 | | 云原生支持 | ⭐⭐⭐ Docker友好 | ⭐ 需额外容器镜像 | > **设计哲学**:Spring Boot优先支持Jar,体现了"开箱即用"的理念,降低传统Java Web应用的复杂度[^4]。在微服务架构中,Jar的独立运行能力使其成为默认选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值