最近用了SpringBoot的项目,使用了特定的方式来配置,让我们可以不用再看那么一坨xml真是神清气爽。之前的开发一直都是在eclipse上,因为习惯了IDEA,所以在idea上试了一下,结果出了点小问题。

             首先,springboot有两种启动方式,既可以直接通过main方法启动,也可以在tomcat里启动,在main方法里启动很简单,直接run启动类的main方法就可以了。在tomcat里启动是需要配置一下的,需要实现以下SpringBootServletInitializer


@EnableSwagger2
	@SpringBootApplication
	@EnableAutoConfiguration
	public class ClaimApplication extends SpringBootServletInitializer {
	
	    @Override
	    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
	        return application.sources(ClaimApplication.class);
	    }
	
	}



        在eclipse中两种启动方式都可以,由于用idea打开了项目直接采用的是main方法的方式,导致了失败。其中过程中有几种报错是缺少一些jar包,所以当时认为是maven配置的问题,结果从maven配置入手重新下载了jar,结果无效。一直也很奇怪为什么同样的项目,在eclipse中可以,到了idea中就不行了。也许是idea配置的问题,因为eclipse中默认使用命名空间的方式,一个窗口一个命名空间,而idea中每个项目一个配置,后来在网上查了一些关于idea配置的问题,还是没有解决。因为启动程序的时候一直报的是因为找不到某个jar包,还有一个错误是这样的:      

org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.
	at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:133)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:474)
	at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118)
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:690)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:322)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:970)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:959)
	at com.mzjf.ClaimApplication.main(ClaimApplication.java:30)
Caused by: org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.
	at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.getEmbeddedServletContainerFactory(EmbeddedWebApplicationContext.java:185)
	at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.java:158)
	at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:130)
	... 7 common frames omitted



           查了查原因大概意思就是不能启动containerFactory,初始化容器失败。而网上说的是因为多引了CXF包,如下:


<!-- Jetty is needed if you're are not using the CXFServlet -->  
 <dependency>  
   <groupId>org.apache.cxf</groupId>  
   <artifactId>cxf-rt-transports-http-jetty</artifactId>  
   <version>${cxf.version}</version>  
</dependency>

但是我并没有引入这个jar包,但是仿佛找到的思路,也许我也是多引了某个jar,而且和启动有关。所以顺势找到了我多引用的一个jar包。

          

idea 启动springboot程序设置启动目录 idea用springboot启动_spring

          

               当我把这个jar删掉的时候

org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.
	at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:133)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:474)
	at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118)
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:690)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:322)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:970)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:959)
	at com.mzjf.ClaimApplication.main(ClaimApplication.java:30)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
Caused by: org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.
	at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.getEmbeddedServletContainerFactory(EmbeddedWebApplicationContext.java:185)
	at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.java:158)
	at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:130)
	... 12 common frames omitted

          

             然后加入jar包

            

idea 启动springboot程序设置启动目录 idea用springboot启动_java_02

            使用main方法启动成功。

 

             至此问题解决,同时采用tomcat部署时应该采用上面的spring-boot-starter-tomcat,异常问题解决了,springboot两种方式都可以正常启动。


总结:

1、删除导致spring boot可能认为不使用默认容器的jar包,上例中可以删除依赖的tomcat的jar包

2、在springboot中加入spring-boot-starter-jetty,明确我们想使用什么容器,不要让spring boot引起误会和错误的可能猜测

3、Springboot默认集成的是Tomcat容易,如果想换成Jetty容器,首先则需要把默认的Tomcat容器去除,然后引入Jetty依赖