Spring Boot 应用打包为包含外部依赖的 WAR 文件
修改项目打包类型为 WAR
在 Maven 的 pom.xml 文件中,将默认的 jar 打包方式更改为 war:
<packaging>war</packaging>
引入本地第三方 JAR 依赖
若项目依赖未发布到中央仓库的 JAR 包(如存放在 src/main/resources/lib 目录下),可通过 system 范围进行引用。例如,添加一个名为 otc-commons-logging-1.2.jar 的本地库:
<dependency>
<groupId>otc</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/resources/lib/otc-commons-logging-1.2.jar</systemPath>
</dependency>
注意:system 类型依赖不会自动包含在最终构建产物中,需配合插件手动处理。
排除嵌入式 Tomcat 容器
由于应用将部署至外部 Servlet 容器(如独立安装的 Tomcat),需移除 Spring Boot 内置的 Tomcat 组件。以下是两种可行方案:
方案一:显式声明并设为 provided 范围
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
此配置表示该依赖参与编译和测试,但在打包时不会被打进 WAR 文件。
方案二:从 web 启动器中排除 Tomcat
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
这种方式通过排除机制移除内嵌容器,效果与第一种一致。
配置 Maven 插件以包含本地 JAR
为确保本地依赖被复制到 WAR 包的 WEB-INF/lib 目录下,需使用 maven-war-plugin 自定义资源拷贝行为:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<webResources>
<resource>
<directory>src/main/resources/lib</directory>
<targetPath>WEB-INF/lib</targetPath>
<includes>
<include>**/*.jar</include>
</includes>
</resource>
</webResources>
</configuration>
</plugin>
同时建议保留编译插件设置以兼容特定 JDK 版本:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<compilerArgs>
<arg>-bootclasspath</arg>
<arg>${JAVA_HOME}/jre/lib/rt.jar</arg>
</compilerArgs>
</configuration>
</plugin>
调整启动类以支持外部 Servlet 容器
Spring Boot 默认以 Java Application 方式启动,但部署到外部 Tomcat 需要基于传统 Servlet 上下文加载。因此,主应用类应继承 SpringBootServletInitializer 并重写 configure 方法:
@SpringBootApplication
public class MyApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(MyApplication.class);
}
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
这样既能支持 IDE 内直接运行调试,也能适配外部容器部署场景。