Jetty 12加载ResourceServlet出现ClassNotFoundException求助
解决Jetty 12中ResourceServlet类找不到与配置错误问题
问题根源分析
你遇到的ClassNotFoundException本质是类路径缺失或配置参数不符合Jetty 12规则,结合版本架构变化,具体原因如下:
- 虽启用
ee10-servlet模块,但运行时类路径未实际包含jetty-ee10-servlet的jar包; baseResource路径配置不符合Jetty 12的资源解析逻辑;- 未配置关键参数导致URL映射与资源路径匹配冲突。
分步解决方案
1. 确保依赖/模块正确加载
- Maven/Gradle项目:添加与Jetty 12版本一致的
jetty-ee10-servlet依赖:<!-- Maven示例 --> <dependency> <groupId>org.eclipse.jetty.ee10</groupId> <artifactId>jetty-ee10-servlet</artifactId> <version>12.0.7</version> <!-- 替换为你的Jetty版本 --> <scope>provided</scope> </dependency> - Jetty Home部署:确保通过命令或配置文件启用
ee10-servlet模块:
验证:检查运行时类路径中是否存在# 启动时临时添加模块 java -jar start.jar --add-modules=ee10-servlet # 或持久化到start.ini echo "--module=ee10-servlet" >> start.inijetty-ee10-servlet-12.x.x.jar,并确认该jar内包含org.eclipse.jetty.ee10.servlet.ResourceServlet类。
2. 修正web.xml配置
调整参数确保资源路径与URL映射匹配:
<servlet> <servlet-name>webapp-servlet</servlet-name> <servlet-class>org.eclipse.jetty.ee10.servlet.ResourceServlet</servlet-class> <init-param> <param-name>dirAllowed</param-name> <param-value>false</param-value> </init-param> <init-param> <param-name>baseResource</param-name> <param-value>./webapp</param-value> <!-- 指向WAR根目录下的webapp文件夹,去掉末尾斜杠 --> </init-param> <!-- 关键参数:让ResourceServlet仅处理URL中的pathInfo部分,避免映射冲突 --> <init-param> <param-name>pathInfoOnly</param-name> <param-value>true</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>webapp-servlet</servlet-name> <url-pattern>/webapp/*</url-pattern> </servlet-mapping>
baseResource:用./webapp明确指向Web应用根目录下的静态资源文件夹,Jetty会自动解析相对路径;pathInfoOnly:设为true后,ResourceServlet会忽略URL中的servlet路径(即/webapp),仅用pathInfo(即/*部分)匹配资源,确保访问/webapp/css/style.css时,正确读取webapp/css/style.css文件。
3. 关于DefaultServlet的警告
Jetty 12中DefaultServlet被设计为仅用于根路径映射(/*),映射到非根路径会触发警告是正常的设计约束,因此官方建议用ResourceServlet处理非根路径静态资源是正确选择。
内容的提问来源于stack exchange,提问作者rawcode
相关产品推荐
相关产品推荐

