我需要以两种模式运行我的Spring应用程序:
作为命令行应用程序(没有Tomcat)的CommandLineRunner
的
SpringBootServletInitializer REST应用程序问题:有可能吗?如何实现此设置?
发布于 2020-02-05 20:03:33
我认为问题中有一个矛盾:
如果您使用SpringBootServletInitializer,那么工件应该被打包为WAR,并部署在一些WAR服务器上,比如tomcat。在这种情况下,Tomcat是而不是。
如果您想要嵌入式Tomcat,那么您不需要WAR,您应该使用“通常”的jar类型的spring引导应用程序工件。
几个可能有用的事实:
CommandLineRunner bean没有什么特别之处,只是当应用程序上下文可用时,spring引导将在实现此接口的所有bean上自动运行run方法。
依赖项中有一个web启动程序这一事实通常意味着您打算运行web服务器(tomcat),但是并不总是这样,您可以指定web env。键入“NONE”,嵌入的tomcat将不会启动(有关更多技术信息,请参见this thread )
现在,考虑到这两个事实,并且假设您没有真正构建一个WAR (在本例中,您将不得不在嵌入式tomcat上托管它,java不会识别WAR)--例如,您可以定义一个“风味”--例如配置文件,并定义命令行运行程序的配置只对某些配置文件是活动的,而不是运行tomcat的属性--运行tomcat与另一种类型的配置文件相关。
更新
根据OP的评论:
因此,我们的目标是能够运行:
java -jar myapp.war只有CommandLineRunner才能运行,没有真正的tomcat会被加载。
另一方面,您希望将myapp.war放到某些tomcat的webapp文件夹中,这样就不会调用CommandLineRunner了,对吗?
在这种情况下,考虑实施以下建议:
application-cmd.properties并指定tomcat不应该运行(web )。类型= NONE) -请参阅我在上面提供的链接
CommandLineRunner实现上添加@Profile("cmd"),以便在指定配置文件“cmd”时只运行。--spring.profiles.active=cmd标志运行java -jar myapp.war,以便加载cmd配置文件。https://stackoverflow.com/questions/60082329
复制相似问题