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

步骤:
  1. 修改pom.xml
<packaging>war</packaging>  <!-- 改为war -->
  1. 排除嵌入式Tomcat(可选但推荐)
    如果部署到外部Tomcat,需将内嵌Tomcat依赖设为provided
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><scope>provided</scope>
</dependency>
  1. 添加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);}
}
  1. 重新打包
mvn clean package  # 生成WAR文件(位于target目录)
注意事项:
  • 如果项目使用了内嵌服务器特有的功能(如server.port),需确保外部容器兼容。
  • 静态资源路径需符合Servlet规范(如/src/main/webapp)。

2. 从WAR切换为JAR

步骤:
  1. 修改pom.xml
<packaging>jar</packaging>  <!-- 改为jar -->
  1. 移除Tomcat的provided作用域
    如果之前排除了内嵌Tomcat,需恢复默认依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><!-- 删除或注释<scope>provided</scope> -->
</dependency>
  1. 移除SpringBootServletInitializer(可选)
    如果不需要外部容器部署,可删除启动类中的继承:
@SpringBootApplication
public class YourApplication {  // 直接保留main方法即可public static void main(String[] args) {SpringApplication.run(YourApplication.class, args);}
}
  1. 重新打包
mvn clean package  # 生成可执行JAR文件
注意事项:
  • 确保所有依赖兼容内嵌服务器(如避免使用Java EE容器特有API)。
  • 如果原WAR项目依赖web.xml/WEB-INF目录,需调整代码或资源路径。

3. 关键差异与常见问题

操作

JAR → WAR

WAR → JAR

配置改动

需添加SpringBootServletInitializer

需移除容器相关配置

依赖调整

排除内嵌Tomcat(可选)

恢复内嵌Tomcat依赖

部署验证

检查外部容器兼容性

确保无容器依赖的代码


4. 总结

  • 可以切换:通过修改pom.xml和少量代码调整即可实现。
  • 推荐工具:使用IDE(如IntelliJ IDEA)的Maven插件快速验证依赖冲突。
  • 测试必做:切换后务必测试所有功能(尤其是Web相关端点、静态资源、数据库连接等)。

如果只是临时切换,可以通过Maven的profiles实现动态打包(需更复杂配置)。