Spring boot 将warofspring引导应用程序部署到本地Tomcat服务器:404响应
我使用生成了一个简单的web应用程序,并选择Spring boot 将warofspring引导应用程序部署到本地Tomcat服务器:404响应,spring-boot,tomcat,Spring Boot,Tomcat,我使用生成了一个简单的web应用程序,并选择war作为打包类型。使用mvn spring boot从终端启动:运行并将我的浏览器指向http://localhost:8080/greeting返回预期的响应 我在部署步骤中遵循了这一点,并修改了pom.xml,以避免在生成的war中包含版本号: ${artifactId} ... 我像往常一样使用mvn clean install构建war,并获得了预期的demo spring web.war,我将其复制/粘贴到apache-tomcat-1
war
作为打包类型。使用mvn spring boot从终端启动:运行并将我的浏览器指向http://localhost:8080/greeting
返回预期的响应
我在部署步骤中遵循了这一点,并修改了pom.xml
,以避免在生成的war中包含版本号:
${artifactId}
...
我像往常一样使用mvn clean install
构建war,并获得了预期的demo spring web.war
,我将其复制/粘贴到apache-tomcat-10.0.4/webapp
文件夹中
然后,我从Tomcatbin
文件夹启动了Tomcat bu运行catalina.sh run
。
Tomcat启动并显示了要成功部署的演示SpringWeb.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状态
怎么了
spring initializer的默认准备/初始化应用程序包含初始化该应用程序的main()方法,以便它可以在独立模式下运行并可以快速测试。
如果您想将它部署到另一个容器中,您应该创建一个servlet来初始化应用程序
因此,您应该使用SpringBootServletInitializer扩展具有main方法的类,并删除main方法
如果您在中有插件“org.springframework.boot”,那么“mvn清理包”将失败
我认为遵循以上两个步骤将使构建的war可以部署在外部tomcat中
我以前读过一篇文章,可能这也有帮助:您必须声明一个运行类,该类扩展了SpringBootServletInitializer,以便在war模式下部署。如下所示:
@SpringBootApplication公共类AppTomcat扩展
SpringBootServletInitializer{
}
即使它完全没有意义,我也尝试过,但没有成功,-每个部署的应用程序都在自己的上下文中运行,这就是为什么如果你没有调整一些Tomcat设置,你应该总是用应用程序名作为路由的前缀。Spring的javax.servlet.ServletContainerInitializer
被Tomcat 10默默忽略,它寻找一个jakarta.servlet.ServletContainerInitializer
。非常感谢@PiotrP.Karwasz,将Tomcat版本降级到9.0.45
版本解决了这个问题。该死的:)。好吧,甲骨文拒绝雅加达EE保留javax.*
名称空间给那些不经常关注JavaEE新闻的人带来了数千小时的挫折。