如何解决运行mvn jetty:run时出现的java.lang.NoClassDefFoundError错误
解决
java.lang.NoClassDefFoundError: javax/servlet/jsp/JspFactory错误 这个错误的核心原因很明确:你的项目运行时类路径里缺少JSP相关的API类。javax.servlet.jsp.JspFactory是JSP规范定义的类,而你当前只引入了Servlet核心API(javax.servlet-api),这个包并不包含任何JSP相关的类。
下面是具体的解决步骤:
1. 添加JSP API依赖
在你的Maven pom.xml中添加JSP API的依赖,对应Servlet 3.0版本的JSP API是2.2.1版本:
<dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>javax.servlet.jsp-api</artifactId> <version>2.2.1</version> <scope>provided</scope> </dependency>
- 为什么设置
scope=provided?因为像Jetty、Tomcat这类Servlet容器本身就自带了JSP API的实现,设置为provided可以避免打包时重复引入,减少包体积。 - 如果添加后还是报错,可以暂时注释掉
<scope>provided</scope>,让Maven把这个依赖加入运行时类路径,确认问题解决后再恢复这个配置。
2. 检查Servlet API与Jetty版本的兼容性
注意到你使用的是Jetty6插件,Jetty6本身只支持Servlet 2.5规范,但你引入的是Servlet 3.0.1的API,这可能存在潜在的版本冲突。如果你的项目不需要Servlet 3.0的特性,建议把Servlet API的版本降到2.5,和Jetty6更匹配:
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency>
3. 验证Jetty插件配置
确保你的Maven Jetty插件版本是稳定的Jetty6版本,比如6.1.26,插件配置示例:
<build> <plugins> <plugin> <groupId>org.mortbay.jetty</groupId> <artifactId>maven-jetty-plugin</artifactId> <version>6.1.26</version> <configuration> <!-- 你的Jetty配置,比如端口、上下文路径等 --> <connectors> <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector"> <port>8080</port> </connector> </connectors> </configuration> </plugin> </plugins> </build>
完成以上配置后,重新运行mvn jetty:run,应该就能解决这个类找不到的错误了。
内容的提问来源于stack exchange,提问作者quarks
相关产品推荐
相关产品推荐

