我如何将Spring Boot WAR部署到Tomcat?

3

在发布之前,我花了不少时间处理这个问题……

我有一个正常运行的 Spring Boot 应用程序,可以作为 JAR 运行,但当我尝试将其转换为 WAR 时无法部署。

我尝试查找相关规则,以确定是嵌入式 Tomcat 还是外部 Tomcat。

WAR 文件似乎没问题,带有 WEB-INF/lib 和 WEB-INF/lib-provided 目录,没有明显错放的 JAR 包。

我的 Application 类扩展了 SpringBootServletInitializer。在调试时,此类将应用程序上下文类设置为 AnnotationConfigEmbeddedWebApplicationContext.class... 这样做是否正确?

在尝试将其部署为 WAR 文件时,是否应该看到加载 Embedded 类?

我使用的是:

1)Spring Framework 4.1.2.RELEASE 2)Spring Boot 1.1.9.RELEASE 3)Spring Security 3.2.5.RELEASE 4)Tomcat 7.0.57

该应用程序同时使用 WebMvc 和 WebSockets……

谢谢

我的父 POM 中包含:

<dependencyManagement>
    ....
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>${spring.boot.version}</version>
        <type>pom</type>
        <scope>import</scope>
    </dependency>
    ....
</dependencyManagement>

我的POM文件包含以下spring-boot工件。
    <!-- Spring Boot -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-websocket</artifactId>
        <!-- WebSocket Latest -->
        <!--<version>1.2.0.RC1</version>-->
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-tomcat</artifactId>
            </exclusion>
        </exclusions>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-websocket</artifactId>
        <scope>provided</scope>
    </dependency>
    <!--
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
    -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>

    <!-- Spring Boot Security -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>

这是将其作为WAR包在Tomcat 7.0.57中部署,并使用-Ddebug参数。

很抱歉会有这么多日志记录;-(

....
123143 [RMI TCP Connection(2)-127.0.0.1] DEBUG o.s.b.c.c.ConfigFileApplicationListener - Skipped config file 'classpath:/application.yaml' for profile resource not found
123143 [RMI TCP Connection(2)-127.0.0.1] INFO  o.s.b.c.e.AnnotationConfigEmbeddedWebApplicationContext - Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@54d9aaa1: startup date [Wed Dec 03 09:13:08 GMT 2014]; parent: org.springframework.context.annotation.AnnotationConfigApplicationContext@2c6debf9
123190 [RMI TCP Connection(2)-127.0.0.1] DEBUG o.s.b.c.e.AnnotationConfigEmbeddedWebApplicationContext - Bean factory for org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@54d9aaa1: org.springframework.beans.factory.support.DefaultListableBeanFactory@10dbb363: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,play.application,errorPageFilter]; parent: org.springframework.beans.factory.support.DefaultListableBeanFactory@3d5e51e5
141940 [RMI TCP Connection(2)-127.0.0.1] INFO  o.s.b.f.xml.XmlBeanDefinitionReader - Loading XML bean definitions from URL [jar:file:/E:/Software/Servers/apache-tomcat-7.0.57/webapps/ROOT/WEB-INF/lib/cf_shared-1.0-SNAPSHOT.jar!/spring/beanRefContext.xml]
142065 [RMI TCP Connection(2)-127.0.0.1] INFO  o.s.b.f.xml.XmlBeanDefinitionReader - Loading XML bean definitions from URL [jar:file:/E:/Software/Servers/apache-tomcat-7.0.57/webapps/ROOT/WEB-INF/lib/cf_shared-1.0-SNAPSHOT.jar!/spring/globalApplicationContext.xml]
142174 [RMI TCP Connection(2)-127.0.0.1] INFO  o.s.b.f.xml.XmlBeanDefinitionReader - Loading XML bean definitions from URL [jar:file:/E:/Software/Servers/apache-tomcat-7.0.57/webapps/ROOT/WEB-INF/lib/cf_shared-1.0-SNAPSHOT.jar!/spring/globalApplicationContext-configuration.xml]
142455 [RMI TCP Connection(2)-127.0.0.1] INFO  o.s.b.f.s.DefaultListableBeanFactory - Overriding bean definition for bean 'org.springframework.boot.autoconfigure.AutoConfigurationPackages': replacing [Generic bean: class [org.springframework.boot.autoconfigure.AutoConfigurationPackages$BasePackages]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null] with [Generic bean: class [org.springframework.boot.autoconfigure.AutoConfigurationPackages$BasePackages]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null]
146518 [RMI TCP Connection(2)-127.0.0.1] INFO  o.s.b.f.s.DefaultListableBeanFactory - Overriding bean definition for bean 'beanNameViewResolver': replacing [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration; factoryMethodName=beanNameViewResolver; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/web/ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration.class]] with [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter; factoryMethodName=beanNameViewResolver; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter.class]]
162564 [RMI TCP Connection(2)-127.0.0.1] INFO  o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'async' of type [class com.cf.play.config.Async$$EnhancerBySpringCGLIB$$dd119135] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
162939 [RMI TCP Connection(2)-127.0.0.1] INFO  o.s.s.c.ThreadPoolTaskExecutor - Initializing ExecutorService  'getAsyncExecutor'
162939 [RMI TCP Connection(2)-127.0.0.1] INFO  o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'getAsyncExecutor' of type [class org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
162939 [RMI TCP Connection(2)-127.0.0.1] INFO  o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'org.springframework.scheduling.annotation.ProxyAsyncConfiguration' of type [class org.springframework.scheduling.annotation.ProxyAsyncConfiguration$$EnhancerBySpringCGLIB$$7617ce05] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
164892 [RMI TCP Connection(2)-127.0.0.1] INFO  o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'org.springframework.security.config.annotation.configuration.ObjectPostProcessorConfiguration' of type [class org.springframework.security.config.annotation.configuration.ObjectPostProcessorConfiguration$$EnhancerBySpringCGLIB$$6c9aa01e] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
165611 [RMI TCP Connection(2)-127.0.0.1] INFO  o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'objectPostProcessor' of type [class org.springframework.security.config.annotation.configuration.AutowireBeanFactoryObjectPostProcessor] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
165642 [RMI TCP Connection(2)-127.0.0.1] INFO  o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler@41b21e0a' of type [class org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
167330 [RMI TCP Connection(2)-127.0.0.1] INFO  o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'security.AuthenticationConfiguration' of type [class com.cf.play.config.Security$AuthenticationConfiguration$$EnhancerBySpringCGLIB$$f014df73] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
168111 [RMI TCP Connection(2)-127.0.0.1] INFO  o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration' of type [class org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration$$EnhancerBySpringCGLIB$$fe30e14e] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
169814 [RMI TCP Connection(2)-127.0.0.1] INFO  o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'securityProperties' of type [class org.springframework.boot.autoconfigure.security.SecurityProperties] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
170861 [RMI TCP Connection(2)-127.0.0.1] INFO  o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'org.springframework.boot.autoconfigure.security.AuthenticationManagerConfiguration' of type [class org.springframework.boot.autoconfigure.security.AuthenticationManagerConfiguration$$EnhancerBySpringCGLIB$$538cd08c] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
171392 [RMI TCP Connection(2)-127.0.0.1] INFO  o.s.b.f.xml.XmlBeanDefinitionReader - Loading XML bean definitions from URL [jar:file:/E:/Software/Servers/apache-tomcat-7.0.57/webapps/ROOT/WEB-INF/lib/cf_shared-1.0-SNAPSHOT.jar!/spring/globalApplicationContext-configuration.xml]
171502 [RMI TCP Connection(2)-127.0.0.1] INFO  o.s.b.f.xml.XmlBeanDefinitionReader - Loading XML bean definitions from URL [jar:file:/E:/Software/Servers/apache-tomcat-7.0.57/webapps/ROOT/WEB-INF/lib/cf_shared-1.0-SNAPSHOT.jar!/spring/globalApplicationContext-security.xml]
171908 [RMI TCP Connection(2)-127.0.0.1] INFO  o.s.s.c.SpringSecurityCoreVersion - You are running with Spring Security Core 3.2.5.RELEASE
171939 [RMI TCP Connection(2)-127.0.0.1] INFO  o.s.s.c.SecurityNamespaceHandler - Spring Security 'config' module version is 3.2.5.RELEASE
172267 [RMI TCP Connection(2)-127.0.0.1] INFO  o.s.b.f.xml.XmlBeanDefinitionReader - Loading XML bean definitions from URL [jar:file:/E:/Software/Servers/apache-tomcat-7.0.57/webapps/ROOT/WEB-INF/lib/cf_shared-1.0-SNAPSHOT.jar!/spring/globalApplicationContext.xml]
172377 [RMI TCP Connection(2)-127.0.0.1] INFO  o.s.c.s.GenericXmlApplicationContext - Refreshing org.springframework.context.support.GenericXmlApplicationContext@7b50e9c5: startup date [Wed Dec 03 09:13:57 GMT 2014]; root of context hierarchy
172705 [RMI TCP Connection(2)-127.0.0.1] INFO  o.s.c.e.EhCacheManagerFactoryBean - Initializing EhCache CacheManager
174923 [RMI TCP Connection(2)-127.0.0.1] INFO  org.quartz.impl.StdSchedulerFactory - Using default implementation for ThreadExecutor
175048 [RMI TCP Connection(2)-127.0.0.1] INFO  o.quartz.core.SchedulerSignalerImpl - Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl
175048 [RMI TCP Connection(2)-127.0.0.1] INFO  org.quartz.core.QuartzScheduler - Quartz Scheduler v.2.2.1 created.
175064 [RMI TCP Connection(2)-127.0.0.1] INFO  org.quartz.simpl.RAMJobStore - RAMJobStore initialized.
175064 [RMI TCP Connection(2)-127.0.0.1] INFO  org.quartz.core.QuartzScheduler - Scheduler meta-data: Quartz Scheduler (v2.2.1) 'CAS ProxyGrantingTicketStorage Scheduler' with instanceId 'NON_CLUSTERED'
  Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally.
  NOT STARTED.
  Currently in standby mode.
  Number of jobs executed: 0
  Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads.
  Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.

175064 [RMI TCP Connection(2)-127.0.0.1] INFO  org.quartz.impl.StdSchedulerFactory - Quartz scheduler 'CAS ProxyGrantingTicketStorage Scheduler' initialized from an externally provided properties instance.
175064 [RMI TCP Connection(2)-127.0.0.1] INFO  org.quartz.impl.StdSchedulerFactory - Quartz scheduler version: 2.2.1
175080 [RMI TCP Connection(2)-127.0.0.1] INFO  org.quartz.core.QuartzScheduler - JobFactory set to: org.springframework.scheduling.quartz.AdaptableJobFactory@24917741
175111 [RMI TCP Connection(2)-127.0.0.1] INFO  o.s.c.s.DefaultLifecycleProcessor - Starting beans in phase 2147483647
175111 [RMI TCP Connection(2)-127.0.0.1] INFO  o.s.s.quartz.SchedulerFactoryBean - Starting Quartz Scheduler now
175111 [RMI TCP Connection(2)-127.0.0.1] INFO  org.quartz.core.QuartzScheduler - Scheduler CAS ProxyGrantingTicketStorage Scheduler_$_NON_CLUSTERED started.
175330 [RMI TCP Connection(2)-127.0.0.1] INFO  o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'globalParentApplicationContext' of type [class org.springframework.context.support.GenericXmlApplicationContext] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
175392 [RMI TCP Connection(2)-127.0.0.1] INFO  o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration' of type [class org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration$$EnhancerBySpringCGLIB$$61dc3bd3] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
176486 [RMI TCP Connection(2)-127.0.0.1] INFO  o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'org.springframework.security.config.annotation.method.configuration.GlobalMethodSecurityConfiguration' of type [class org.springframework.security.config.annotation.method.configuration.GlobalMethodSecurityConfiguration$$EnhancerBySpringCGLIB$$f4cff750] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
176658 [RMI TCP Connection(2)-127.0.0.1] INFO  o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'methodSecurityMetadataSource' of type [class org.springframework.security.access.method.DelegatingMethodSecurityMetadataSource] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
176736 [RMI TCP Connection(2)-127.0.0.1] INFO  o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'metaDataSourceAdvisor' of type [class org.springframework.security.access.intercept.aopalliance.MethodSecurityMetadataSourceAdvisor] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
176767 [RMI TCP Connection(2)-127.0.0.1] DEBUG o.s.b.c.e.AnnotationConfigEmbeddedWebApplicationContext - Unable to locate MessageSource with name 'messageSource': using default [org.springframework.context.support.DelegatingMessageSource@10a32452]
176783 [RMI TCP Connection(2)-127.0.0.1] DEBUG o.s.b.c.e.AnnotationConfigEmbeddedWebApplicationContext - Using ApplicationEventMulticaster [org.springframework.context.event.SimpleApplicationEventMulticaster@774aa541]
323644 [RMI TCP Connection(2)-127.0.0.1] DEBUG o.s.b.c.e.t.TomcatEmbeddedServletContainerFactory - Code archive: E:\Software\Servers\apache-tomcat-7.0.57\webapps\ROOT\WEB-INF\lib\spring-boot-1.1.9.RELEASE.jar
323644 [RMI TCP Connection(2)-127.0.0.1] DEBUG o.s.b.c.e.t.TomcatEmbeddedServletContainerFactory - Code archive: E:\Software\Servers\apache-tomcat-7.0.57\webapps\ROOT\WEB-INF\lib\spring-boot-1.1.9.RELEASE.jar
323644 [RMI TCP Connection(2)-127.0.0.1] DEBUG o.s.b.c.e.t.TomcatEmbeddedServletContainerFactory - None of the document roots [src/main/webapp, public, static] point to a directory and will be ignored.
323660 [RMI TCP Connection(2)-127.0.0.1] INFO  o.s.b.c.e.t.TomcatEmbeddedServletContainerFactory - Server initialized with port: 8080
Dec 03, 2014 9:16:29 AM org.apache.catalina.core.StandardService startInternal
INFO: Starting service Tomcat
Dec 03, 2014 9:16:29 AM org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet Engine: Apache Tomcat/7.0.57
Dec 03, 2014 9:16:29 AM org.apache.catalina.loader.WebappLoader startInternal
SEVERE: LifecycleException 
java.lang.ClassNotFoundException: org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedWebappClassLoader
    at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:260)
    at org.apache.catalina.loader.WebappLoader.createClassLoader(WebappLoader.java:721)
    at org.apache.catalina.loader.WebappLoader.startInternal(WebappLoader.java:582)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5357)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1575)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1565)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

确保您没有web.xml,如果有,请删除它或确保其版本为3.0而不是更低版本。发布一些配置和您的pom文件。在我看来,您正在覆盖默认的Spring Boot依赖项,而不是使用推荐的starters。如果我没记错的话,Spring boot 1.1.x使用的是Spring 4.0。 - M. Deinum
starter-web依赖项不应标记为提供。只有starter-tomcat需要它。 - Andy Wilkinson
我已经从starter-web依赖项中删除了“provided”范围。结果是相同的。 - CobraFlow
2个回答

2

好的,我已经找到问题所在...配置文件!

@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
    return application
            .showBanner(true)
            .parent(Global.class)
            .child(applicationClass)
            .profiles("container")
            ;
}

应该是...

@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
    return application
            .showBanner(true)
            .parent(Global.class)
            .sources(applicationClass)
            .profiles("container")
            ;
}

我使用了child()而不是sources()...

感谢您的时间!


你可以接受自己的答案来向他人展示你的问题已经解决。 - Simulant

1
你能将父项目设置为spring-boot-starter-parent吗?
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.1.9.RELEASE</version>
</parent>

此外,您应该将spring-boot-starter-tomcat设置为提供的。

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>

如果您链接整个POM或有效的POM,可能会有所帮助。

我无法将父Pom设置为引导父Pom,因为我已经使用了内部层次结构,并且该构件的作用域已设置为如上所述的“提供”。我的WAR文件看起来是正确的。关于引导选择嵌入式还是外部的规则是什么? - CobraFlow
主要的决策点基于是否存在ServletContext。如果不存在,Boot将启动一个嵌入式容器。 - Andy Wilkinson
我已经更新了问题并附上了日志输出。奇怪的是,它认为应该启动嵌入式Tomcat,而实际上是由Tomcat加载的WAR文件。在这种情况下,我会认为不应该看到任何类名中带有“Embed”一词的类... - CobraFlow
调试代码时,我发现没有servletContext,因此创建了一个嵌入式Servlet容器。Catalina servletContext可用于SpringBootServletInitializer.onStartup(),但似乎要么丢失,要么未传递... - CobraFlow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接