1. 打包格式与用途
- JAR (Java Archive)
- 自包含可执行文件:Spring Boot默认选项,打包成一个可执行的JAR文件(包含嵌入式Tomcat/Jetty等服务器)。
- 运行方式:通过
java -jar your-app.jar
直接运行。 - 适用场景:微服务、云原生应用或独立运行的应用程序,无需依赖外部Servlet容器。
- WAR (Web Application Archive)
- 传统Web部署包:打包成WAR文件,需要部署到外部的Servlet容器(如Tomcat、WebLogic等)。
- 运行方式:需将WAR文件放入容器的
webapps
目录,由容器启动。 - 适用场景:需要与旧有Java EE环境集成,或部署到已有Servlet容器的企业级应用。
2. 结构差异
- JAR
包含所有依赖(包括嵌入式服务器),结构扁平化。主类是SpringBootApplication
的启动类。 - WAR
遵循Java EE标准结构,包含WEB-INF
目录和web.xml
(可选)。需提供SpringBootServletInitializer
的子类作为入口。
3. 依赖与配置
- JAR
无需额外配置,Spring Boot的spring-boot-maven-plugin
会自动处理可执行JAR的打包。 - WAR
需在pom.xml
中:
<packaging>war</packaging>
并排除嵌入式Tomcat(避免与外部容器冲突):
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><scope>provided</scope>
</dependency>
4. 优缺点对比
特性 | JAR | WAR |
启动速度 | 快(内嵌服务器) | 依赖外部容器,可能较慢 |
部署灵活性 | 简单(单文件) | 需容器支持 |
资源占用 | 较高(内嵌服务器) | 由容器管理,可共享资源 |
传统兼容性 | 不适用旧有Java EE环境 | 兼容企业级Servlet容器 |
5. 如何选择?
- 选JAR:
- 开发微服务或独立应用。
- 使用云原生部署(Docker/Kubernetes)。
- 追求简单快速的开发和部署。
- 选WAR:
- 必须部署到现有Tomcat/WebLogic等容器。
- 企业环境强制要求WAR格式。
- 需要与其他Java EE组件(如JSP)集成。
6. 注意事项
- Spring Boot推荐使用JAR,因其简化部署和符合现代云原生趋势。
- 若从传统Spring MVC迁移到Spring Boot,可逐步过渡到JAR格式。
根据实际需求选择即可,Spring Boot对两者均有良好支持。
在Spring Boot项目中,打包方式(JAR/WAR)可以在工程完成后切换,但需要调整配置和代码。以下是具体步骤和注意事项:
1. 从JAR切换为WAR
步骤:
- 修改
pom.xml
<packaging>war</packaging> <!-- 改为war -->
- 排除嵌入式Tomcat(可选但推荐)
如果部署到外部Tomcat,需将内嵌Tomcat依赖设为provided
:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><scope>provided</scope>
</dependency>
- 添加Servlet初始化类
在启动类同级目录下创建类继承SpringBootServletInitializer
:
@SpringBootApplication
public class YourApplication extends SpringBootServletInitializer {@Overrideprotected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {return builder.sources(YourApplication.class);}public static void main(String[] args) {SpringApplication.run(YourApplication.class, args);}
}
- 重新打包
mvn clean package # 生成WAR文件(位于target目录)
注意事项:
- 如果项目使用了内嵌服务器特有的功能(如
server.port
),需确保外部容器兼容。 - 静态资源路径需符合Servlet规范(如
/src/main/webapp
)。
2. 从WAR切换为JAR
步骤:
- 修改
pom.xml
<packaging>jar</packaging> <!-- 改为jar -->
- 移除Tomcat的
provided
作用域
如果之前排除了内嵌Tomcat,需恢复默认依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><!-- 删除或注释<scope>provided</scope> -->
</dependency>
- 移除
SpringBootServletInitializer
(可选)
如果不需要外部容器部署,可删除启动类中的继承:
@SpringBootApplication
public class YourApplication { // 直接保留main方法即可public static void main(String[] args) {SpringApplication.run(YourApplication.class, args);}
}
- 重新打包
mvn clean package # 生成可执行JAR文件
注意事项:
- 确保所有依赖兼容内嵌服务器(如避免使用Java EE容器特有API)。
- 如果原WAR项目依赖
web.xml
或/WEB-INF
目录,需调整代码或资源路径。
3. 关键差异与常见问题
操作 | JAR → WAR | WAR → JAR |
配置改动 | 需添加 | 需移除容器相关配置 |
依赖调整 | 排除内嵌Tomcat(可选) | 恢复内嵌Tomcat依赖 |
部署验证 | 检查外部容器兼容性 | 确保无容器依赖的代码 |
4. 总结
- 可以切换:通过修改
pom.xml
和少量代码调整即可实现。 - 推荐工具:使用IDE(如IntelliJ IDEA)的Maven插件快速验证依赖冲突。
- 测试必做:切换后务必测试所有功能(尤其是Web相关端点、静态资源、数据库连接等)。
如果只是临时切换,可以通过Maven的profiles
实现动态打包(需更复杂配置)。