我使用Spring Initializer生成了一个简单的Greeting web应用程序,并选择war
作为打包类型。从带有mvn spring-boot:run
的终端启动它并将我的浏览器指向http://localhost:8080/greeting
会返回预期的响应。
我遵循了本文的部署步骤,并修改了pom.xml
,以避免在生成的war:中包含版本号
<build>
<finalName>${artifactId}</finalName>
<plugins>
...
</build>
我像往常一样用mvn clean install
构建战争,并得到了预期的demo-spring-web.war
,我将其复制/粘贴到apache-tomcat-10.0.4/webapp
文件夹中。
然后,我从Tomcatbin
文件夹启动了运行catalina.sh run
的Tomcatbu。Tomcat启动并显示要成功部署的demo-spring-web.war
:
11-Apr-2021 18:24:36.414 INFO [main] org.apache.catalina.startup.HostConfig.deployWAR
Deployment of web application archive [/Users/serguei/soft/apache-tomcat-10.0.4/webapps/demo-spring-web.war] has finished in [1,286] ms
但是,当我尝试访问localhost:8080/demo-spring-web/greeting
上部署的应用程序时,它返回了404状态。
怎么了?
您必须声明一个扩展SpringBootServletInitializer
的运行类,以便在战争模式下部署。像这样:
@SpringBootApplication public class AppTomcat extends SpringBootServletInitializer {
}
- spring初始化器中默认准备/初始化的应用程序包含初始化应用程序的main((方法,以便它可以在独立模式下运行,并可以快速测试。如果您想将其部署到另一个容器,则应该制作一个servlet来初始化应用程序
因此,您应该使用SpringBootServletInitializer扩展具有main方法的类,并移除main方法。
- ;mvn清洁包装";如果你有插件";org.springframework.boot";中
我认为以下两个步骤将使构建的战争能够在外部tomcat中部署。
我以前读过一篇文章,可能也有帮助:https://www.baeldung.com/spring-boot-war-tomcat-deploy