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
相关产品推荐
相关产品推荐

