Weblogic 12c部署非Web Spring Boot应用未启动,需实现何种接口?
解决Weblogic 12c启动无Servlet Spring Boot应用的问题
我之前也碰到过一模一样的场景——把纯后台服务类型的Spring Boot应用打包成War部署到Weblogic,结果War包能正常安装,但完全看不到应用启动的迹象。核心原因其实很明确:Weblogic作为Java EE容器,默认只会触发Web相关的初始化流程(比如Servlet、Filter的加载),你的应用没有Servlet,自然不会触发Spring上下文的启动逻辑。除了WebApplicationInitializer,你还有这几个可行的方案:
1. 实现ServletContainerInitializer接口(Servlet 3.0+标准方案)
这是Servlet规范定义的容器启动钩子,Weblogic 12c完全支持。你只需要做两步:
- 编写初始化类,在
onStartup方法里手动启动Spring Boot应用:
import javax.servlet.ServletContainerInitializer; import javax.servlet.ServletContext; import javax.servlet.ServletException; import java.util.Set; import org.springframework.boot.SpringApplication; import com.yourpackage.YourMainApplication; public class SpringBootAppInitializer implements ServletContainerInitializer { @Override public void onStartup(Set<Class<?>> classes, ServletContext servletContext) throws ServletException { // 触发Spring Boot上下文启动 SpringApplication.run(YourMainApplication.class); } }
- 在项目的
src/main/resources/META-INF/services目录下创建名为javax.servlet.ServletContainerInitializer的文件,内容是你刚才编写的类的全限定名:
com.yourpackage.SpringBootAppInitializer
Weblogic启动时会扫描这个文件,找到你的初始化类并执行onStartup方法,从而启动Spring应用。
2. 配置Weblogic启动类(无需修改代码,控制台配置)
如果你不想额外编写代码,可以通过Weblogic控制台指定一个启动类:
- 写一个简单的启动类,包含一个无参启动方法:
import org.springframework.boot.SpringApplication; import com.yourpackage.YourMainApplication; public class WeblogicSpringStarter { public void startApp() { SpringApplication.run(YourMainApplication.class); } }
- 在部署War包到Weblogic时,进入部署配置的「Startup and Shutdown Classes」板块,添加这个类并指定启动方法为
startApp。Weblogic启动应用时会自动调用这个方法,触发Spring上下文初始化。
3. 继承SpringBootServletInitializer(兼容传统War部署)
虽然你的应用没有Servlet,但SpringBootServletInitializer本质是WebApplicationInitializer的实现类,它能帮你自动触发Spring Boot的启动流程。你只需要让主应用类继承它:
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; @SpringBootApplication public class YourMainApplication extends SpringBootServletInitializer { public static void main(String[] args) { SpringApplication.run(YourMainApplication.class, args); } }
这样即使没有Servlet,Weblogic也会通过WebApplicationInitializer的机制启动你的Spring Boot应用。
另外需要注意:确保你的Spring Boot版本和Weblogic 12c兼容(比如Spring Boot 2.x对应Weblogic 12cR2及以上版本),避免版本冲突导致启动失败。
内容的提问来源于stack exchange,提问作者Michiel Haisma
相关产品推荐
相关产品推荐

