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

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注解指定路径,比如:
    import javax.ws.rs.ApplicationPath;
    import javax.ws.rs.core.Application;
    
    @ApplicationPath("/api")
    public class JaxrsApplication extends Application {
    }
    
    这样Wildfly会自动识别并使用RESTEasy处理请求,不需要手动配置Servlet。
  • 简化依赖配置:你已经引入了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实现,需要完成以下两步:

  1. 添加完整的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>
    
  2. 排除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>
    
  3. 保持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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:11:36