Liferay中Web-ContextPath配置无效问题排查求助
解决Liferay 7 SPA静态资源404问题
我之前在构建Liferay 7集成JAX-RS的SPA时也碰到过一模一样的404问题,折腾了好一会儿才搞定。下面是几个你需要排查的关键配置点:
1. 确保Bundle被识别为Web Bundle并处于Active状态
首先,你的Bundle必须是Active状态,而且Liferay要把它当成Web Bundle处理:
- 打开Liferay的Gogo Shell(通常是
telnet localhost 11311或者在控制面板的Gogo Shell工具里),输入lb | grep demo-spa-react,确认你的Bundle状态是Active,而不是Resolved或Installed。如果状态不对,检查日志里的依赖缺失信息。 - 在
bnd.bnd里,除了Web-ContextPath: /demo-spa-react,还要确保有正确的类路径配置,比如:Bundle-ClassPath: .,WEB-INF/classes Web-ContextPath: /demo-spa-react
2. 正确依赖Servlet API
Liferay 7使用Servlet 3.1+,你需要在bnd.bnd里明确导入正确版本的Servlet包,而不是仅仅强制依赖:
Import-Package: javax.servlet;version="[3.1,4)", javax.servlet.http;version="[3.1,4)"
这能确保你的Bundle能访问到Liferay提供的Servlet容器服务,从而正确处理静态资源请求。
3. 避免JAX-RS路由拦截静态资源
如果你的JAX-RS应用设置了@ApplicationPath("/"),它会拦截所有请求,包括静态资源的访问!这是最容易踩的坑之一:
- 修改你的JAX-RS应用类,把
@ApplicationPath设置为一个特定的前缀,比如/api:
这样JAX-RS只会处理@ApplicationPath("/api") public class YourJaxRsApplication extends Application { // 你的JAX-RS配置 }/o/demo-spa-react/api/*的请求,静态资源请求就会被Liferay正确路由到META-INF/resources下的文件。
4. 检查静态资源路径和上下文路径冲突
- 确认
index.html是直接放在META-INF/resources根目录下,而不是子文件夹里。如果在子文件夹,访问路径要对应调整(比如/o/demo-spa-react/subfolder/index.html)。 - 进入Liferay控制面板的Configuration > System Settings > Web > Web Contexts,查看是否有其他Bundle使用了
/demo-spa-react这个上下文路径,冲突会导致你的资源无法被正确映射。
5. 查看部署日志排查错误
如果以上都没问题,去Liferay的日志文件(比如tomcat/logs/liferay.log)里搜索你的Bundle名称,看看部署过程中有没有报错,比如资源加载失败、依赖缺失或者配置冲突的信息,这些往往能直接指出问题所在。
内容的提问来源于stack exchange,提问作者Vasily Pankratov
相关产品推荐
相关产品推荐

