多个Sprint启动配置

时间:2017-09-17 18:28:56

标签: tomcat spring-boot gradle

我的Spring Boot应用程序中有两个带main方法的类 1. XYZToolApplication
2. XYZWebApplication
它们都延伸SpringBootServletInitializer。两者都使用@SpringBootApplication@Configuration进行注释。

我使用Gradle作为构建工具 我想做两件事:
1.使用XYZWebApplication运行bootRun并进行战争部署 2.只要命令行参数XYZToolApplicationbootRun命令一起提供,就只使用args运行bootRun

我将build.gradle修改为:

bootRun {
    main = 'com.XYZWebApplication'
    if ( project.hasProperty('args') ) {
        main = 'com.XYZToolApplication'
        args project.args.split('\\s+')
    }
    classpath = sourceSets.main.runtimeClasspath + configurations.dev
    jvmArgs = ["-Dspring.output.ansi.enabled=ALWAYS"]
}

war {
    doFirst {
        manifest {
            attributes(
                    "Implementation-Title": project.name,
                    "Implementation-Version": version,
                    "Implementation-Timestamp": new Date())
        }
    }
    archiveName 'xyz.war'
}

虽然我可以根据需要运行bootRun,但是当我创建war存档并将其部署到Tomcat8时,会创建两个上下文,一个用于XYZWebApplication,一个用于XYZToolApplication。我可以在日志中看到这个(catalina.out)。我只想创建XYZWebApplication个上下文。

记录日志:

...
2017-09-15 19:20:59.209  INFO 23727 --- [ost-startStop-1] XYZWebApplication : Started XYZWebApplication in 7.677 seconds (JVM running for 10.57)  
....
2017-09-15 19:21:01.197  INFO 23727 --- [ost-startStop-1] XYZToolApplication : Started XYZToolApplication in 1.983 seconds (JVM running for 12.557)

我已尝试在springBoot任务和/或bootRepackage任务和/或war任务中指定主要类,但它没有帮助。

1 个答案:

答案 0 :(得分:0)

根据SpringBootServletInitiaizer的文档:

  

运行SpringApplication的自以为是的WebApplicationInitializer   来自传统的WAR部署。绑定Servlet,过滤器和   ServletContextInitializer bean从应用程序上下文到   servlet容器。
  如果您正在使用SpringBootServletInitializer   与您可能还需要的其他WebApplicationInitializers组合   添加@Ordered注释以配置特定的启动顺序   请注意,只有您需要WebApplicationInitializer   构建一个war文件并进行部署。如果您更喜欢运行嵌入式   容器然后根本不需要这个。

所以我所做的就是不为SpringBootServletInitiaizer扩展XYZToolApplication,因为我不想构建战争并使用此上下文部署它。