将SpringBoot简易Web服务从Tomcat迁移至Liberty后端点无法识别
解决Liberty部署Spring Boot WAR时的"Context Root not Found"问题
这个问题我之前也碰到过,核心原因是Spring Boot内置Tomcat和Liberty对Web应用上下文根的默认处理逻辑不一样:
- 你用Spring Initializr搭建的项目,内置Tomcat启动时默认会把上下文根设为
/(根路径),所以直接访问localhost:8080/hello没问题。 - 但Liberty遵循Java EE的部署规范,当你把WAR放到
dropins目录时,它默认会用WAR文件的名称作为上下文根。比如你的WAR叫demo.war,那上下文根就是/demo,这时候你得访问localhost:9080/demo/hello才能正常请求,而不是直接用/hello,这就是你看到"Context Root not Found"的原因。
下面给你几个简单的解决办法,选哪个都行:
方法1:重命名WAR文件
把你的WAR文件改成ROOT.war,然后放到dropins目录重启Liberty。Liberty会把名为ROOT.war的应用部署到根上下文(/),这时候访问localhost:9080/hello就和内置Tomcat一样正常了。
方法2:在Spring Boot里显式指定上下文根
在你的项目的src/main/resources/application.properties里添加一行配置:
server.servlet.context-path=/
或者用YAML格式的application.yml:
server: servlet: context-path: /
重新打包WAR后部署到Liberty,不管WAR叫什么名字,上下文根都会是/,直接访问localhost:9080/hello即可。
方法3:通过Liberty的server.xml配置上下文根
如果你不想改WAR文件或者Spring配置,可以直接修改Liberty的server.xml,添加一个webApplication节点来指定上下文根:
<webApplication id="your-spring-app" location="your-app.war" contextRoot="/"/>
这里的location填你实际的WAR文件名,contextRoot设为/,重启Liberty后就能正常访问localhost:9080/hello了。
另外提醒一下:如果用方法3,最好把WAR从dropins目录移到Liberty的apps目录下,这样配置会更清晰,避免dropins的自动部署规则和手动配置冲突。
内容的提问来源于stack exchange,提问作者Mark Lavin
相关产品推荐
相关产品推荐

