You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jetty配置上下文路径后静态资源404 如何同路径部署API与静态资源

问题根因

你当前配置的ResourceHandler未被加入Jetty的请求处理链,且与WebAppContext的路径映射存在冲突,导致静态资源请求无法被正确匹配处理。

调整方案

修改后的完整配置代码

String webFolder = "webapp";
Server server = new Server();

// 基础路径读取逻辑保持不变
String serverBaseUrl;
if( (serverBaseUrl = System.getenv("ZKUI_BASEURL")) == null) {
    if((serverBaseUrl = globalProps.getProperty("baseURL")) == null) {
        serverBaseUrl = "/";
    }
}

// 配置WebAppContext处理Controller请求
WebAppContext servletContextHandler = new WebAppContext();
servletContextHandler.setContextPath(serverBaseUrl);
servletContextHandler.setAttribute("org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern", ".*(/target/classes/|.*.jar)");
servletContextHandler.setParentLoaderPriority(true);
servletContextHandler.setInitParameter("useFileMappedBuffer", "false");
servletContextHandler.setAttribute("globalProps", globalProps);

// 配置静态资源处理器
ResourceHandler staticResourceHandler = new ResourceHandler();
staticResourceHandler.setDirectoriesListed(false);
Resource staticResources = Resource.newClassPathResource(webFolder);
staticResourceHandler.setBaseResource(staticResources);
staticResourceHandler.setWelcomeFiles(new String[]{"html/index.html"});

// 新增:组装处理链,静态资源优先匹配,未命中则交给Controller处理
HandlerList handlerList = new HandlerList();
handlerList.setHandlers(new Handler[]{staticResourceHandler, servletContextHandler});
server.setHandler(handlerList);

核心修改点说明

  • 新增HandlerList按顺序挂载处理器:Jetty会先尝试用ResourceHandler匹配静态资源请求,匹配失败的请求才会交给WebAppContext处理Controller接口
  • 移除了WebAppContext中重复的setResourceBase配置,避免静态资源路径映射冲突
  • 两个处理器共用同一套serverBaseUrl上下文路径,确保静态资源和REST接口都统一挂载在指定的基础路径下

效果验证

当你将ZKUI_BASEURL环境变量设置为/org/zkui时:

  • /org/zkui/home类请求会交由Controller正常处理
  • /org/zkui/js/bootstrap.min.js类静态资源请求,会自动从src/main/resources/webapp/js目录下读取对应文件返回

内容的提问来源于stack exchange,提问作者Niranjan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 20:36:03