spring中yml配置上下文与tomcat等外部容器不一致问题
结论:外部优先级大于内部
在 application.yml
中配置了:
server:port: 8080servlet:context-path: /demo
这表示你的 Spring Boot 应用的上下文路径(context-path)是 /demo
,即访问你的服务时,URL 必须以 /demo
开头,比如:
http://localhost:8080/demo/xxx
部署时 "path": "/DemoApplication"
- 在部署(比如 Tomcat、容器、云平台等)时,指定了
"path": "/DemoApplication"
,这是外部容器的 context-path 配置。 - 例如,在 Tomcat 的
server.xml
或者云平台的部署配置中,可能会有<Context path="/DemoApplication" .../>
或类似的参数。
谁生效?
- 外部容器优先级更高:如果你用外部容器(如 Tomcat、WebSphere)部署 Spring Boot 的 war 包,外部容器的 context-path(如
/DemoApplication
)会覆盖 Spring Boot 内部的application.yml
配置。 - 内嵌容器生效:如果你用 Spring Boot 的 jar 包(内嵌 Tomcat),则只会用
application.yml
里的context-path
配置(如/demo
)。
访问路径举例
- 内嵌 Tomcat(jar 方式)
访问路径为:http://localhost:8080/demo/xxx
- 外部 Tomcat(war 方式,配置了 path=/DemoApplication)
访问路径为:http://localhost:8080/DemoApplication/xxx
总结
- 谁生效?
- 用 jar 包启动,
application.yml
的context-path
生效。 - 用 war 包部署到外部容器,容器的 context-path 配置生效,
application.yml
的context-path
可能会被覆盖。
- 用 jar 包启动,
- 建议
- 不要同时在外部容器和
application.yml
配置 context-path,容易混淆。 - 推荐统一在一个地方配置,优先用外部容器的 context-path。
- 不要同时在外部容器和
如需进一步区分或排查实际生效路径,可以访问 /
看实际跳转到哪个路径,或查看启动日志中的 context-path 信息。