如何在Eclipse中将Spring Boot Maven项目部署到WebLogic并解决部署错误
解决Spring Boot项目部署到WebLogic的WebSocket冲突问题
我来帮你搞定这个WebLogic部署的问题,你遇到的这两个错误其实都是Spring Boot自带的Tomcat WebSocket组件和WebLogic内置的Tyrus WebSocket实现冲突导致的,咱们一步步来解决:
1. 彻底排除Tomcat WebSocket相关依赖
你已经把spring-boot-starter-tomcat设为provided了,但spring-boot-starter-websocket默认会引入Tomcat的WebSocket嵌入包,这是冲突的根源。需要在pom.xml里明确排除这个依赖:
<!-- 排除Spring Boot WebSocket依赖中的Tomcat WebSocket组件 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> <exclusions> <exclusion> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-websocket</artifactId> </exclusion> </exclusions> </dependency> <!-- 确保Tomcat starter处于provided范围,避免打包进war --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency>
2. 配置WebLogic优先使用自身的WebSocket实现
在src/main/webapp/WEB-INF/weblogic.xml中添加类加载偏好配置,让WebLogic优先加载自身的Tyrus相关类,而不是尝试加载应用中的Tomcat类:
<weblogic-web-app xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.7/weblogic-web-app.xsd"> <container-descriptor> <!-- 优先使用WebLogic自带的WebSocket相关类 --> <prefer-application-packages> <package-name>org.glassfish.tyrus.*</package-name> <package-name>javax.websocket.*</package-name> </prefer-application-packages> <!-- 关闭优先加载WEB-INF类,避免冲突 --> <prefer-web-inf-classes>false</prefer-web-inf-classes> </container-descriptor> </weblogic-web-app>
3. 检查并清理间接依赖
有些第三方库可能会间接引入Tomcat WebSocket依赖,你可以用Maven命令查看依赖树:
mvn dependency:tree
如果输出中还有tomcat-embed-websocket或其他Tomcat WebSocket相关包,找到对应的依赖并添加排除规则。
4. 确认Spring Boot启动类配置
因为是war包部署,你的启动类必须继承SpringBootServletInitializer并重写configure方法,确保WebLogic能正确识别Spring Boot应用:
@SpringBootApplication public class YourApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(YourApplication.class); } public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } }
5. 清理缓存并重新部署
- 清理Maven本地缓存:删除
~/.m2/repository中相关的Tomcat和Spring Boot缓存文件 - 清理WebLogic服务器缓存:删除WebLogic domain目录下的
tmp和cache文件夹 - 重新执行
mvn clean package生成war包,再部署到WebLogic
错误原因解释
- ClassCastException:WebLogic的
TyrusServletFilter尝试将Tomcat的WsServerContainer转换为自身的TyrusServerContainer,这是因为应用中同时存在两种WebSocket实现类,排除Tomcat的WebSocket依赖后就不会加载WsServerContainer了。 - 找不到PojoEndpointBase:这个类是Tomcat WebSocket的私有实现类,当WebLogic尝试加载WebSocket相关逻辑时,因为残留了Tomcat的依赖引用,导致找不到该类,彻底排除后即可解决。
内容的提问来源于stack exchange,提问作者adarsh
相关产品推荐
相关产品推荐

