如何修改Karaf/OSGi Blueprint Web应用的基础URL/上下文路径
Pax Web 调整上下文路径到 /test 的可行方案
你之前直接往jetty.xml追加WebAppContext配置失效的核心原因:Pax Web在OSGi环境下不会用标准Jetty的WebAppContext加载通过Blueprint注册的Servlet和静态资源,你追加的独立配置相当于新建了一个空的、没有绑定任何业务资源的上下文,和Pax Web自身管理的上下文逻辑完全隔离,必然导致所有页面无法访问。
方案1:通过Pax Web原生配置修改(优先推荐,无兼容问题)
不需要修改jetty.xml,直接编辑现有配置文件etc/org.ops4j.pax.web.cfg,新增一行配置:
org.ops4j.pax.web.contextPath=/test
保存后重启OSGi容器即可生效,Pax Web会自动将所有通过Blueprint、HTTP Whiteboard模式注册的Servlet、静态资源统一挂载到/test上下文路径下,原生适配你的两个需求:
- 登录页、仪表盘页自动映射到
https://<ip>:<port>/test/LoginPage.html、https://<ip>:<port>/test/Dashboard.html,无需额外修改Servlet映射配置 - 原有根路径重定向逻辑会自动适配新上下文,访问
https://<ip>:<port>/test时会自动跳转到/test/LoginPage.html
注意:如果你的静态页面、前端资源是放在bundle默认的/META-INF/resources、/OSGI-INF/resources目录下,这个配置会自动给资源路径加上/test前缀,不需要单独调整资源映射规则。
方案2:通过jetty.xml调整(仅用于特殊定制场景)
如果有特殊需求必须通过jetty.xml修改,不能直接在文件末尾追加孤立的WebAppContext配置,需要修改Pax Web自身使用的上下文Handler配置:
- 打开你当前使用的默认
etc/jetty.xml,找到id为Contexts的ContextHandlerCollection配置段 - 在Pax Web注册
HttpServiceContext的配置块内,追加contextPath设置,不要新建独立的WebAppContext节点,参考配置如下:
<Configure id="Server" class="org.eclipse.jetty.server.Server"> <!-- 原有默认配置全部保留,不要修改 --> <Set name="handler"> <New id="Contexts" class="org.eclipse.jetty.server.handler.ContextHandlerCollection"> <Call name="addHandler"> <Arg> <New class="org.ops4j.pax.web.service.jetty.internal.HttpServiceContext"> <!-- 追加下面这行配置设置上下文路径 --> <Set name="contextPath">/test</Set> <!-- 该节点下原有resourceBase、servletHandler等配置全部保留,不要删除 --> </New> </Arg> </Call> <!-- 其他原有Handler配置全部保留 --> </New> </Set> <!-- 原有默认配置全部保留,不要修改 --> </Configure>
保存后重启容器即可生效。
配置后必查项
- 检查前端Angular代码中写死的绝对请求路径,比如原来写死的
/servlet/xxx这类路径,要么改成相对路径,要么统一加上/test前缀,避免后端接口请求404 - 如果原来的根路径重定向是自定义Servlet实现的,检查重定向的Location头不要写死绝对路径
/LoginPage.html,改成相对路径LoginPage.html即可自动适配新上下文
内容的提问来源于stack exchange,提问作者Saied Tazari
相关产品推荐
相关产品推荐

