不为可执行WAR调用SpringBootServletInitializer#configure

mic*_*ldo 2 spring-boot

我想将war应用程序迁移到Spring引导应用程序。

我按照http://docs.spring.io/spring-boot/docs/1.4.1.RELEASE/reference/htmlsingle/#howto-convert-an-existing-application-to-spring-boot的说明进行操作,并制作了类

@EnableAutoConfiguration
public class MyInitializer extends SpringBootServletInitializer {

  @Override
  protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
    application.banner(new MyBanner());
    application.sources(MyEndpoint.class);
    return application;
  }
}
Run Code Online (Sandbox Code Playgroud)

我得到了可部署的WAR。

在下一阶段,我想获取可执行的WAR。我上课了

public class MyApplication {

    public static void main(String[] args) {
        SpringApplication.run(MyInitializer.class, args);
    }

}
Run Code Online (Sandbox Code Playgroud)

问题是当我调用java -jar target/myapp.warMyInitializer#configure时未执行

我有点困惑。如何避免从MyInitializer到MyApplication的复制粘贴逻辑。我必须将这些课程合为一体吗?

ale*_*xbt 5

就个人而言,我将两者合并在一起:

@SpringBootApplication
public class MyApplication extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return MyApplication.build(builder);
    }

    public static void main(String[] args) {
        MyApplication.build(new SpringApplicationBuilder()).run(args);
    }

    private static SpringApplicationBuilder build(SpringApplicationBuilder builder) {
        return builder.banner(new MyBanner()).sources(MyEndpoint.class);
    }
}
Run Code Online (Sandbox Code Playgroud)
  • 我真的不认为SpringBootServletInitializer将WAR作为可执行文件启动时将永远不会执行。即使文件扩展名是WAR,您实际上也将其用作JAR

  • 从命令行启动时Spring Boot入口点是主要方法,SpringBootServletInitializer只是不被解释为Spring Boot入口点

  • SpringBootServletInitializer仅在部署为WAR时使用:容器将使用SpringBoot SpringBootServletInitializer作为入口(而main方法将被完全忽略)。