Wildfly 16部署Java EE项目遇ServletContainer类缺失错误求助
解决Wildfly 16部署Java EE项目时的
org.glassfish.jersey.servlet.ServletContainer找不到问题 这个问题的核心原因很明确:Wildfly 16默认使用RESTEasy(JBoss官方的JAX-RS实现),而你的项目尝试引用GlassFish Jersey的Servlet容器类,但对应的依赖没有包含在部署包中,同时Wildfly本身也不提供这个类,所以抛出了ClassNotFoundException。下面给你两种解决方案,根据你的需求选择:
方案一:改用Wildfly自带的RESTEasy(推荐)
这是最省心的方案,因为RESTEasy和Wildfly深度集成,不需要额外配置依赖,也不会有兼容性问题:
- 移除Jersey相关的Servlet配置:检查你的
web.xml,如果有类似下面的配置,直接删除:<servlet> <servlet-name>Jersey Servlet</servlet-name> <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> </servlet> - 使用标准JAX-RS注解声明应用:创建一个继承
javax.ws.rs.core.Application的类,用@ApplicationPath注解指定路径,比如:
这样Wildfly会自动识别并使用RESTEasy处理请求,不需要手动配置Servlet。import javax.ws.rs.ApplicationPath; import javax.ws.rs.core.Application; @ApplicationPath("/api") public class JaxrsApplication extends Application { } - 简化依赖配置:你已经引入了
javaee-web-api(scope为provided),这个依赖已经包含了JAX-RS的API,所以不需要额外添加Jersey相关的API依赖。对于JAXB,Wildfly 16自带了完整的JAXB实现,你可以把当前的JAXB依赖(jaxb-api、jaxb-runtime、jaxb-core)的scope改为provided,或者直接移除,避免和服务器自带的实现冲突。
方案二:强制使用Jersey(不推荐,除非有特殊需求)
如果你必须使用Jersey作为JAX-RS实现,需要完成以下两步:
- 添加完整的Jersey依赖:在你的
pom.xml中添加Jersey Servlet容器及核心依赖:<!-- Jersey Servlet容器依赖 --> <dependency> <groupId>org.glassfish.jersey.containers</groupId> <artifactId>jersey-container-servlet</artifactId> <version>2.31</version> <!-- 选择支持JAX-RS 2.1的版本(Java EE8对应JAX-RS 2.1) --> </dependency> <!-- 可选:用Jersey BOM统一管理版本 --> <dependencyManagement> <dependencies> <dependency> <groupId>org.glassfish.jersey</groupId> <artifactId>jersey-bom</artifactId> <version>2.31</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> - 排除Wildfly自带的RESTEasy模块:在项目的
WEB-INF目录下创建jboss-deployment-structure.xml,内容如下,避免Jersey和RESTEasy的冲突:<jboss-deployment-structure> <deployment> <!-- 排除JAX-RS子系统 --> <exclude-subsystems> <subsystem name="jaxrs" /> </exclude-subsystems> <!-- 排除相关的RESTEasy模块 --> <exclusions> <module name="javax.ws.rs.api" /> <module name="org.jboss.resteasy.resteasy-jaxrs" /> <module name="org.jboss.resteasy.resteasy-jaxb-provider" /> </exclusions> </deployment> </jboss-deployment-structure> - 保持web.xml的Jersey配置:确保你的
web.xml中正确配置了Jersey的ServletContainer,这样请求才会被Jersey处理。
额外注意事项
- 不要随意修改Wildfly的
domain.xml或standalone.xml,除非你需要全局配置。使用jboss-deployment-structure.xml进行部署级别的配置更安全,不会影响服务器上的其他应用。 - 检查依赖版本兼容性:Java EE 8对应JAX-RS 2.1,所以如果选择Jersey,一定要选支持JAX-RS 2.1的版本(2.26及以上),避免出现API不兼容的问题。
内容的提问来源于stack exchange,提问作者André K
相关产品推荐
相关产品推荐

