Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot 将warofspring引导应用程序部署到本地Tomcat服务器:404响应_Spring Boot_Tomcat - Fatal编程技术网

Spring boot 将warofspring引导应用程序部署到本地Tomcat服务器:404响应

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

我使用生成了一个简单的web应用程序,并选择
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
文件夹中

然后,我从Tomcat
bin
文件夹启动了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新闻的人带来了数千小时的挫折。