在 Spring Boot 项目中打包是一个非常关键的过程通常你会选择将应用打包成一个 JAR 或 WAR 文件并且可能会包含一些额外的资源和配置。不同类型的项目如标准 Spring Boot 项目、Spring Boot HTML 项目、Spring Boot Web 项目需要的打包配置会有所不同。下面我会从这三个角度出发详细介绍每种类型的 Spring Boot 项目打包配置及其解析。1. Spring Boot 项目的打包配置对于一个标准的 Spring Boot 项目通常我们会使用 Spring Boot Maven 插件 或 Spring Boot Gradle 插件 来打包。以下是 Maven 打包的常见配置。pom.xml 中的配置build plugins !-- Spring Boot Maven Plugin -- plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId configuration !-- 是否生成可执行的 JAR 包 -- mainClasscom.example.demo.DemoApplication/mainClass /configuration /plugin !-- 可选配置 Maven Shade 插件用于生成 Fat JAR -- plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-shade-plugin/artifactId version3.2.1/version executions execution phasepackage/phase goals goalshade/goal /goals /execution /executions /plugin /plugins /build配置说明spring-boot-maven-plugin这是 Spring Boot 提供的 Maven 插件用于将应用打包成可执行的 JAR 文件支持内嵌的 Tomcat/Jetty 容器。mainClass指定 Spring Boot 主应用类的全限定名Spring Boot 启动时会从这个类开始执行。maven-shade-plugin这个插件用于创建 Fat JAR它将所有依赖和 Spring Boot 项目代码打包到一个 JAR 中方便部署和运行。打包方式执行 mvn clean package 命令后会生成一个包含所有依赖的 可执行 JAR 文件可以通过 java -jar xxx.jar 启动。如果你的 Spring Boot 应用需要独立运行打包成 JAR 是最佳选择。2. Spring Boot HTML 项目的打包配置在一个包含 HTML 页面和前端资源如 JavaScript、CSS的 Spring Boot 项目中前端资源通常放在 src/main/resources/static 目录中Spring Boot 会自动提供静态文件服务。pom.xml 中的配置build plugins !-- Spring Boot Maven Plugin -- plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId configuration mainClasscom.example.demo.DemoApplication/mainClass /configuration /plugin /plugins /build资源文件目录结构src└── main├── java├── resources│ ├── static│ │ ├── index.html│ │ └── css/│ │ └── styles.css│ ├── templates│ │ └── index.html│ └── application.properties配置说明静态资源Spring Boot 默认会扫描 src/main/resources/static、src/main/resources/public、src/main/resources/META-INF/resources 和 src/main/resources/resources 目录下的文件并作为静态资源服务。如果你将 HTML 文件放在 static 文件夹下Spring Boot 会直接提供服务。模板引擎如果你使用了 Thymeleaf 等模板引擎HTML 文件应该放在 templates 目录下Spring Boot 会自动处理动态模板的渲染。打包方式执行 mvn clean package 命令后Spring Boot 会将 static 中的所有文件打包到 JAR 包中的 /BOOT-INF/classes/static/ 目录中。当你运行应用时静态资源可以通过 /static/ 路径访问。如果需要将前端文件与 Spring Boot 应用一起打包前端代码不需要额外的构建步骤除非使用了 Webpack 或其他前端构建工具。3. Spring Boot Web 项目的打包配置对于一个包含 Web 层如控制器、过滤器、拦截器等的 Spring Boot 项目通常涉及到内嵌的 Web 容器如 Tomcat 或 Jetty。你可以选择将其打包为 WAR 文件以便在外部的容器中运行或者使用内嵌的 Tomcat 作为默认的 Web 容器。pom.xml 中的配置dependencies !-- Spring Boot Starter Web -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency !-- Spring Boot Starter Tomcat (optional, Spring Boot 默认会包含 Tomcat) -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-tomcat/artifactId scopeprovided/scope /dependency /dependencies build plugins !-- Spring Boot Maven Plugin -- plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId configuration !-- 如果是 WAR 包指定主类 -- mainClasscom.example.demo.DemoApplication/mainClass /configuration /plugin /plugins /build配置说明spring-boot-starter-web用于支持 Spring MVC 功能自动引入 Tomcat 作为嵌入式 Web 容器。你也可以使用其他容器如 Jetty 或 Undertow。spring-boot-starter-tomcat如果你希望将应用部署到外部 Tomcat 容器中需要将这个依赖的 scope 设置为 provided。如果你希望使用内嵌的 Tomcat可以忽略此依赖因为 Spring Boot 默认包含 Tomcat。spring-boot-maven-plugin用于打包时支持构建 WAR 文件。你可以配置 mainClass指定应用的主类。打包为 WAR 的配置packagingwar/packagingDemoApplication.java 修改为支持 WAR 包如果你要打包成 WAR 包你需要做一些额外的配置使 Spring Boot 应用支持外部 Web 容器。需要修改主类来扩展 SpringBootServletInitializer。SpringBootApplication public class DemoApplication extends SpringBootServletInitializer { Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(DemoApplication.class); } public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }打包方式执行 mvn clean package 命令后Spring Boot 会根据 pom.xml 的配置生成一个 WAR 文件WEB-INF 下包含 Web 层的资源和配置文件。部署到外部的 Tomcat 或其他容器中时可以通过 java -jar 命令运行内嵌的 Tomcat。总结Spring Boot 基础项目适合构建独立应用打包成 JAR 包包含所有依赖配置 spring-boot-maven-plugin。Spring Boot HTML 项目适用于前端静态资源服务静态文件如 HTML、CSS、JS放在 src/main/resources/static 中打包为 JAR 包。Spring Boot Web 项目适用于需要 Web 层的应用可以选择内嵌 Web 容器或部署到外部容器打包为 JAR 或 WAR 包。需要使用 SpringBootServletInitializer 来支持 WAR 包。