2014-11-03 51 views
3

我在使用java -jar命令运行时遇到Spring Boot Jersey应用程序的问题。当我从IntelliJ运行主类时,它工作得很好。我为此假设这可能是一个类路径问题,但我使用了maven-assembly-plugin,并且所有的Spring类似乎都在那里。Spring Boot Jersey - 运行java -jar命令时缺少EmbeddedServletContainerFactory

我见: 弹簧引导启动,网络,弹簧引导球衣,类路径和春季启动其余弹簧引导启动-tomcat的我已经包含了这一点:

<dependency> 
     <!-- Import dependency management from Spring Boot --> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-dependencies</artifactId> 
     <version>1.1.8.RELEASE</version> 
     <type>pom</type> 
     <scope>import</scope> 
    </dependency> 

我的组装插件配置如下:

  <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-jar-plugin</artifactId> 
      <version>2.5</version> 
      <!-- nothing here --> 
     </plugin> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-assembly-plugin</artifactId> 
      <version>2.4.1</version> 
      <configuration> 
       <descriptorRefs> 
        <descriptorRef>jar-with-dependencies</descriptorRef> 
       </descriptorRefs> 
       <archive> 
        <manifest> 
         <mainClass>org.online.auth.conf.ApplicationMain</mainClass> 
        </manifest> 
       </archive> 
      </configuration> 
      <executions> 
       <execution> 
        <phase>package</phase> 
        <goals> 
         <goal>single</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 

当我解压的jar文件我发现,所有Spring的依赖在那里(EmbeddedServletContainer和它的子类(Tomcat的/码头))。

该启动日志显示以下错误消息:

:: Spring Boot :: 

2014-11-03 12:46:38.394 INFO 1264 --- [   main] org.online.auth.conf.ApplicationMain  : Starting ApplicationMain on R9013DA2 with PID 1264 (C:\projects\online\online-authentication-rest\target\online-authentication-rest-0.0.1-SNAPSHOT-jar-with-dependencies.jar started by thomasa in C:\projects\online\online-authentication-rest\target) 
2014-11-03 12:46:38.396 DEBUG 1264 --- [   main] o.s.boot.SpringApplication    : Loading source class com.online.auth.conf.ApplicationMain 
2014-11-03 12:46:38.412 DEBUG 1264 --- [   main] o.s.b.c.c.ConfigFileApplicationListener : Skipped config file 'file:./config/application.yml' resource not found 
2014-11-03 12:46:38.416 DEBUG 1264 --- [   main] o.s.b.c.c.ConfigFileApplicationListener : Loaded config file 'classpath:/application.properties' 
2014-11-03 13:36:23.613 INFO 9732 --- [   main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot[email protected]43738a82: startup date [Mon Nov 03 13:36:23 CET 2014]; root of context hierarchy 
2014-11-03 13:36:23.614 DEBUG 9732 --- [   main] ationConfigEmbeddedWebApplicationContext : Bean factory for org.springframework.boot[email protected]43738a82: org.s[email protected]25b485ba: 
defining beans   [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework .context.annotation.internalAutowiredAnnotationProcessor, 
org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.conte xt.annotation.internalCommonAnnotationProcessor,applicationMain]; root of factory hierarchy 

2014-11-03 13:36:23.787 INFO 9732 --- [   main]  a.ConfigurationClassBeanDefinitionReader : Skipping bean definition for  [BeanMethod:name=basicHttpCredentialsUtil,declaringClass=no.safetel.online.auth.AppConfigSpringSecur  ity]: a definition for bean 'basicHttpCredentialsUtil' already exists. 
This top-level bean definition is considered as an override. 
2014-11-03 13:36:23.873 INFO 9732 --- [   main] f.a.AutowiredAnnotationBeanPostProcessor : JSR-330 'javax.inject.Inject' annotation found and supported for autowiring 
2014-11-03 13:36:23.888 DEBUG 9732 --- [   main] ationConfigEmbeddedWebApplicationContext : Unable to locate MessageSource with name 'messageSource': using default [[email protected]1bff] 
2014-11-03 13:36:23.888 DEBUG 9732 --- [   main] ationConfigEmbeddedWebApplicationContext : Using ApplicationEventMulticaster [org.[email protected]15bbf42f] 
2014-11-03 13:36:23.894 WARN 9732 --- [   main] ationConfigEmbeddedWebApplicationContext : Exception encountered during context initialization - cancelling refresh attempt 

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:124) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:476) 
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:109) 
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:691) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:320) 

我试图明确定义EmbeddedServletContainerFactory但只是给了我另一个异常有消息说A ServletContext is required to configure default servlet handling

对这个问题的任何帮助将不胜感激!

编辑!

我试图打印由容器通过实施BeanPostProcessor创建的每个bean:

@ComponentScan 
@EnableAutoConfiguration(exclude = { 
    DataSourceAutoConfiguration.class, 
    DataSourceInitializer.class, 
    DataSourceTransactionManagerAutoConfiguration.class, 
    SecurityAutoConfiguration.class}) 
public class ApplicationMain extends SpringBootServletInitializer implements BeanPostProcessor  { 

public static void main(String[] args) { 
    ConfigurableApplicationContext context = SpringApplication.run(ApplicationMain.class, args); 
} 

@Override 
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { 
    System.out.println("\t\tbean: "+ beanName); 
    return bean; 
} 

}

中的IntelliJ运行这给了我下面的输出:

2014-11-03 16:11:26.348 INFO 13548 --- [   main] trationDelegate$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) 
    bean: org.springframework.boot.autoconfigure.web.EmbeddedServletContainerAutoConfiguration$EmbeddedTomcat 
    bean: tomcatEmbeddedServletContainerFactory 
    bean: org.springframework.boot.autoconfigure.web.ServerPropertiesAutoConfiguration 
    bean: org.hibernate.validator.internal.constraintvalidators.NotNullValidator 
    bean: serverProperties 
    bean: org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration 
2014-11-03 16:11:26.889 INFO 13548 --- [   main] .t.TomcatEmbeddedServletContainerFactory : Server initialized with port: 8080 

运行带有java命令的jar文件给了我以下输出:

2014-11-03 16:01:36.302 INFO 6704 --- [   main] trationDelegate$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) 
2014-11-03 16:01:36.310 WARN 6704 --- [   main] ationConfigEmbeddedWebApplicationContext : Exception encountered during context initialization - cancelling refresh attempt 

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:124) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:476) 
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:109) 

任何帮助将不胜感激!

回答

1

在阅读完文档后我终于明白了。 Spring docs明确指出,您需要在pom.xml的构建部分中使用spring-boot-maven-plugin。

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-maven-plugin</artifactId> 
     </plugin> 
    </plugins> 
</build> 

我还添加了声明主类的属性:

<properties> 
    <start-class>org.online.auth.ApplicationMain</start-class> 
</properties> 

希望这可以成为对别人的帮助。

相关问题