Spring Boot建议在构建期间使用嵌入式容器(tomcat或码头)创建一个可执行jar,并在运行时将此可执行jar作为独立进程使用。 但是,通常将应用程序部署到外部容器上是很常见的,Spring Boot提供了打包应用程序的方式,专门针对此类需求。
我在这里的重点不是重复关于创建war构件的已经详细的Spring Boot 指导 ,而是在测试创建的文件以查看它是否可以在独立容器上可靠地工作。 我最近在通过Spring Boot项目创建战争并将其部署在Jetty上时遇到了一个问题,这实际上是从该经验中学到的东西。
测试战争能否可靠进行的最佳方法是简单地使用jetty-maven和/或tomcat maven插件 ,并在pom.xml文件中添加以下条目:
<plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version>
</plugin>
<plugin><groupId>org.eclipse.jetty</groupId><artifactId>jetty-maven-plugin</artifactId><version>9.2.3.v20140905</version>
</plugin>
安装好插件后,使用tomcat插件开始战争:
mvn tomcat7:run
并带有码头插件:
mvn jetty:run
如果创建战争的方式存在任何问题,则应在启动时使用这些容器来解决。 例如,如果我要保留嵌入式tomcat依赖项:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>
然后在启动maven tomcat插件时,将出现以下错误:
java.lang.ClassCastException: org.springframework.web.SpringServletContainerInitializer cannot be cast to javax.servlet.ServletContainerInitializer
指示servlet jar与war文件打包在一起的指示,可以通过指定maven依赖项中提供的范围来解决:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><scope>provided</scope>
</dependency>
为什么同时使用jetty和tomcat插件,原因是我看到了行为上的差异,特别是在websocket支持下,jetty作为运行时,而不是tomcat。 因此,请考虑通过以下方式拉出的websocket依赖项:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
这在使用jetty运行时启动时给了我一个错误,并且解决方法是再次标记提供的基础tomcat依赖项,并用以下内容替换上面的内容:
<dependency><groupId>org.springframework</groupId><artifactId>spring-websocket</artifactId>
</dependency>
<dependency><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-websocket</artifactId><scope>provided</scope>
</dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-messaging</artifactId>
</dependency>
因此,总而言之,一种验证为Spring-boot应用程序生成的war文件是否将干净地部署到容器(至少是tomcat和jetty)的快速方法是添加tomcat和jetty maven插件并使用这些插件来启动应用程序。 这是一个演示此示例的示例项目– https://github.com/bijukunjummen/spring-websocket-chat-sample.git
翻译自: https://www.javacodegeeks.com/2014/11/spring-boot-war-packaging.html