2014-12-02 217 views
2

我已经花了好几个小时在此发布之前...如何将spring-boot WAR部署到Tomcat?

我有一个弹簧启动应用程序运行良好作为JAR,但是当我尝试将其转换为WAR我不能部署它。

我试图寻找它的规则来决定它是Tomcat嵌入还是外部。

通过WEB-INF/lib和WEB-INF/lib提供的WAR看起来没有问题,并且没有明显放错位置的罐子。

我的应用程序类扩展了SpringBootServletInitializer。调试时,该类将应用程序上下文类设置为AnnotationConfigEmbeddedWebApplicationContext.class ...这是正确的吗?

我应该会看到嵌入式类加载尝试部署为WAR什么时候?

我使用: -

1)弹簧框架4.1.2.RELEASE 2)弹簧引导1.1.9.RELEASE 3)弹簧安全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 --> 
    <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> 

这里面的Tomcat 7.0.57与-DDEBUG

一个WAR

对不起这么多记录;-(部署

.... 
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[email protected]54d9aaa1: startup date [Wed Dec 03 09:13:08 GMT 2014]; parent: org.spring[email protected]2c6debf9 
123190 [RMI TCP Connection(2)-127.0.0.1] DEBUG o.s.b.c.e.AnnotationConfigEmbeddedWebApplicationContext - Bean factory for org.springframework.boot[email protected]54d9aaa1: org.s[email protected]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.s[email protected]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.[email protected]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 o[email protected]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: [email protected]41 
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 [[email protected]2452] 
176783 [RMI TCP Connection(2)-127.0.0.1] DEBUG o.s.b.c.e.AnnotationConfigEmbeddedWebApplicationContext - Using ApplicationEventMulticaster [org.[email protected]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) 
+0

确保你没有web.xml,如果你有它,或者删除它,或者至少确保版本是3.0而不是更低。发布一些配置和你的pom。因为它在我看来你重写了默认的Spring Boot依赖关系,而不是使用starters(这是推荐的)。如果我记得正确,Spring Boot 1.1.x使用Spring 4.0。 – 2014-12-02 19:14:01

+0

不应将starter-web依赖项标记为提供。这只需要starter-tomcat。 – 2014-12-02 22:50:50

+0

我已经从starter-web依赖项中删除了“提供的”作用域。结果是一样的。 – CobraFlow 2014-12-03 10:59:49

回答

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") 
      ; 
} 

...我用孩子()而不是源()...

谢谢您的时间!

+0

您可以接受您自己的答案以向其他人展示您的问题已解决。 – Simulant 2015-08-13 18:14:58

1

可以让你的父母弹簧引导启动-parent?

<parent> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-parent</artifactId> 
    <version>1.1.9.RELEASE</version> 
</parent> 

你也应该让春天开机启动-tomcat的提供

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

如果您链接你的整个POM或有效POM,可以帮助

+0

我不能让父POM作为引导父母,因为我已经使用了内部层次结构,并且该工件的范围已经设置为如上所述...我的WAR文件看起来是正确的。引导选择嵌入在外部的规则是什么? – CobraFlow 2014-12-02 22:17:41

+0

主要决定点是基于是否存在ServletContext。如果没有,Boot将启动一个嵌入式容器。 – 2014-12-02 22:52:46

+0

我已经用日志输出更新了问题。奇怪的是,它认为它应该启动嵌入式tomcat,当它显然是由Tomcat加载的WAR。我假设在这种情况下,我不应该在其类名中看到任何类中带有“Embed”的类... – CobraFlow 2014-12-03 09:38:02