我的Spring Boot应用程序中有两个带main方法的类
1. XYZToolApplication
2. XYZWebApplication
它们都延伸SpringBootServletInitializer
。两者都使用@SpringBootApplication
和@Configuration
进行注释。
我使用Gradle作为构建工具
我想做两件事:
1.使用XYZWebApplication
运行bootRun
并进行战争部署
2.只要命令行参数XYZToolApplication
随bootRun
命令一起提供,就只使用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
任务中指定主要类,但它没有帮助。
答案 0 :(得分:0)
根据SpringBootServletInitiaizer
的文档:
运行SpringApplication的自以为是的WebApplicationInitializer 来自传统的WAR部署。绑定Servlet,过滤器和 ServletContextInitializer bean从应用程序上下文到 servlet容器。
如果您正在使用SpringBootServletInitializer 与您可能还需要的其他WebApplicationInitializers组合 添加@Ordered注释以配置特定的启动顺序 请注意,只有您需要WebApplicationInitializer 构建一个war文件并进行部署。如果您更喜欢运行嵌入式 容器然后根本不需要这个。
所以我所做的就是不为SpringBootServletInitiaizer
扩展XYZToolApplication
,因为我不想构建战争并使用此上下文部署它。