spring boot应用部署到weblogic需改为war包、排除内嵌tomcat、添加jakarta.servlet-api依赖、继承springbootservletinitializer并重写configure方法、配置weblogic.xml优先加载spring包,且移除server相关配置。

Spring Boot 默认内置 Tomcat,但 WebLogic 是 Java EE 兼容的商用全功能应用服务器,不接受嵌入式容器。要将 Spring Boot 应用部署到 WebLogic,核心不是“打包排他机制”,而是**移除 Servlet 容器依赖 + 适配 Java EE 部署规范 + 确保 WAR 可被 WebLogic 识别和加载**。WebLogic 不运行 `main()` 方法,也不支持 `spring-boot-starter-tomcat`,必须走标准 WAR 部署路径。
修改打包类型为 WAR 并声明为 Web 模块
WebLogic 只部署符合 Java EE 规范的 WAR(或 EAR),不能直接运行 JAR。需强制项目以 WAR 形式构建,并声明其为 Web 应用:
- 在 pom.xml 根节点下设置:
<packaging>war</packaging> - 确保父 POM 版本 ≥ 2.3.0(推荐 2.7.x 或 3.x,WebLogic 14c+ 对 Spring Boot 3.x 有官方支持)
- 不要使用
spring-boot-maven-plugin的repackage目标——它会把依赖打进 BOOT-INF,WebLogic 无法识别;应禁用或跳过该插件
彻底排除嵌入式 Tomcat 及相关 Servlet 实现
WebLogic 自带完整 Servlet/JSP 容器(基于 Eclipse Jetty 或自研实现),Spring Boot 的嵌入式 Tomcat 不仅冗余,还会引发类冲突(如 javax.servlet.*、org.apache.catalina.*):
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 在
spring-boot-starter-web中排除spring-boot-starter-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>
- 显式添加
javax.servlet-api(非实现,仅 API),且 scope 必须为provided:
<dependency><groupid>javax.servlet</groupid><artifactid>servlet-api</artifactid><version>4.0.1</version><scope>provided</scope></dependency>
注意:Spring Boot 2.5+ 推荐用 jakarta.servlet-api(对应 Jakarta EE 9+),若 WebLogic 版本 ≥ 14c(2020 年后),请改用:
<dependency><groupid>jakarta.servlet</groupid><artifactid>jakarta.servlet-api</artifactid><scope>provided</scope></dependency>
提供标准 WebApplicationInitializer 并禁用内嵌启动逻辑
WebLogic 启动时通过 ServletContext 加载应用,不调用 main()。必须提供兼容的初始化入口:
- 启动类继承
SpringBootServletInitializer,重写configure():
@SpringBootApplication
public class MyWebLogicApp extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(MyWebLogicApp.class);
}
// main 方法可保留,但 WebLogic 不会执行它
public static void main(String[] args) {
SpringApplication.run(MyWebLogicApp.class, args);
}
}
- 确保
src/main/webapp/WEB-INF/web.xml存在(即使为空),这是 WebLogic 识别传统 WAR 的关键信号;Spring Boot 2.3+ 可省略,但 WebLogic 12c 及更早版本强烈建议保留空文件 - 在
application.properties中移除所有与 server 相关配置:server.port、server.servlet.context-path、server.tomcat.*等全部失效,由 WebLogic 控制
适配 WebLogic 特定行为与验证部署
WebLogic 对 Spring Boot 的上下文加载、类加载器策略、JNDI 和事务管理有特殊要求:
- 在
src/main/webapp/WEB-INF/weblogic.xml中声明类加载优先级(避免 Spring 冲突):
<weblogic-web-app xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app"><container-descriptor><pre class="brush:php;toolbar:false;" fer-application-packages>
<package-name>org.springframework.*</package-name><package-name>com.fasterxml.jackson.*</package-name>
- 打包后检查 WAR 结构:根目录下应有
WEB-INF/classes/和WEB-INF/lib/,无BOOT-INF/ - 部署时选择“安装为应用程序”而非“库”,并启用“自动部署”或手动部署至
autodeploy目录 - 访问路径为
http://host:port/<context-root>/<your-endpoint></your-endpoint></context-root>,context-root 来自 WAR 包名或 WebLogic 控制台设置
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










