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

WildFly中Jakarta EE集成Apache Shiro遇NoClassDefFoundError求助

问题描述

在WildFly服务器上部署集成Apache Shiro的Jakarta EE应用时,出现NoClassDefFoundError,错误日志如下:

16:49:36,189 ERROR [org.jboss.as.controller.management-operation] (management-handler-thread - 1) WFLYCTL0013: Operation ("deploy") failed - address: ([("deployment" => "testjee8-1.0-SNAPSHOT")]) - failure description: {"WFLYCTL0080: Failed services" => {"jboss.deployment.unit."testjee8-1.0-SNAPSHOT.war".undertow-deployment.UndertowDeploymentInfoService" => "Failed to start service
    Caused by: java.lang.NoClassDefFoundError: Failed to link org/apache/shiro/web/servlet/ShiroFilter (Module "deployment.testjee8-1.0-SNAPSHOT.war" from Service Module Loader): Failed to link org/apache/shiro/web/servlet/AbstractShiroFilter (Module "deployment.testjee8-1.0-SNAPSHOT.war" from Service Module Loader): Failed to link org/apache/shiro/web/servlet/OncePerRequestFilter (Module "deployment.testjee8-1.0-SNAPSHOT.war" from Service Module Loader): Failed to link org/apache/shiro/web/servlet/NameableFilter (Module "deployment.testjee8-1.0-SNAPSHOT.war" from Service Module Loader): Failed to link org/apache/shiro/web/servlet/AbstractFilter (Module "deployment.testjee8-1.0-SNAPSHOT.war" from Service Module Loader): javax/servlet/Filter"}}
16:49:36,190 ERROR [org.jboss.as.controller.management-operation] (management-handler-thread - 1) WFLYCTL0013: Operation ("deploy") failed - address: ([("deployment" => "testjee8-1.0-SNAPSHOT")]) - failure description: {"WFLYCTL0080: Failed services" => {"jboss.deployment.unit."testjee8-1.0-SNAPSHOT.war".undertow-deployment.UndertowDeploymentInfoService" => "Failed to start service
    Caused by: java.lang.NoClassDefFoundError: Failed to link org/apache/shiro/web/servlet/ShiroFilter (Module "deployment.testjee8-1.0-SNAPSHOT.war" from Service Module Loader): Failed to link org/apache/shiro/web/servlet/AbstractShiroFilter (Module "deployment.testjee8-1.0-SNAPSHOT.war" from Service Module Loader): Failed to link org/apache/shiro/web/servlet/OncePerRequestFilter (Module "deployment.testjee8-1.0-SNAPSHOT.war" from Service Module Loader): Failed to link org/apache/shiro/web/servlet/NameableFilter (Module "deployment.testjee8-1.0-SNAPSHOT.war" from Service Module Loader): Failed to link org/apache/shiro/web/servlet/AbstractFilter (Module "deployment.testjee8-1.0-SNAPSHOT.war" from Service Module Loader): javax/servlet/Filter"}}
16:49:36,190 ERROR [org.jboss.as.server] (management-handler-thread - 1) WFLYSRV0021: Deploy of deployment "testjee8-1.0-SNAPSHOT.war" was rolled back with the following failure message: 
{"WFLYCTL0080: Failed services" => {"jboss.deployment.unit."testjee8-1.0-SNAPSHOT.war".undertow-deployment.UndertowDeploymentInfoService" => "Failed to start service
    Caused by: java.lang.NoClassDefFoundError: Failed to link org/apache/shiro/web/servlet/ShiroFilter (Module "deployment.testjee8-1.0-SNAPSHOT.war" from Service Module Loader): Failed to link org/apache/shiro/web/servlet/AbstractShiroFilter (Module "deployment.testjee8-1.0-SNAPSHOT.war" from Service Module Loader): Failed to link org/apache/shiro/web/servlet/OncePerRequestFilter (Module "deployment.testjee8-1.0-SNAPSHOT.war" from Service Module Loader): Failed to link org/apache/shiro/web/servlet/NameableFilter (Module "deployment.testjee8-1.0-SNAPSHOT.war" from Service Module Loader): Failed to link org/apache/shiro/web/servlet/AbstractFilter (Module "deployment.testjee8-1.0-SNAPSHOT.war" from Service Module Loader): javax/servlet/Filter"}}
16:49:36,214 INFO  [org.jboss.as.server.deployment] (MSC service thread 1-3) WFLYSRV0028: Stopped deployment testjee8-1.0-SNAPSHOT (runtime-name: testjee8-1.0-SNAPSHOT.war) in 23ms
[2023-01-02 04:49:36,249] Artifact testjee8:war exploded: Error during artifact deployment. See server log for details.
[2023-01-02 04:49:36,250] Artifact testjee8:war exploded: java.lang.Exception: {"WFLYCTL0080: Failed services" => {"jboss.deployment.unit."testjee8-1.0-SNAPSHOT.war".undertow-deployment.UndertowDeploymentInfoService" => "Failed to start service
    Caused by: java.lang.NoClassDefFoundError: Failed to link org/apache/shiro/web/servlet/ShiroFilter (Module "deployment.testjee8-1.0-SNAPSHOT.war" from Service Module Loader): Failed to link org/apache/shiro/web/servlet/AbstractShiroFilter (Module "deployment.testjee8-1.0-SNAPSHOT.war" from Service Module Loader): Failed to link org/apache/shiro/web/servlet/OncePerRequestFilter (Module "deployment.testjee8-1.0-SNAPSHOT.war" from Service Module Loader): Failed to link org/apache/shiro/web/servlet/NameableFilter (Module "deployment.testjee8-1.0-SNAPSHOT.war" from Service Module Loader): Failed to link org/apache/shiro/web/servlet/AbstractFilter (Module "deployment.testjee8-1.0-SNAPSHOT.war" from Service Module Loader): javax/servlet/Filter"}}

应用配置

web.xml(WEB-INF目录下)

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
         version="5.0">
    <context-param>
        <param-name>shiroConfigLocations</param-name>
        <param-value>/WEB-INF/shiro.ini</param-value>
    </context-param>

    <listener>
        <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class>
    </listener>

    <filter>
        <filter-name>ShiroFilter</filter-name>
        <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>ShiroFilter</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
        <dispatcher>INCLUDE</dispatcher>
        <dispatcher>ERROR</dispatcher>
    </filter-mapping>
</web-app>

shiro.ini(WEB-INF目录下)

[main]


[urls]
/** = noSessionCreation,authcJWT[permissive]

Maven依赖

...
<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-web</artifactId>
    <version>1.10.0</version>
 </dependency>
...
解决方案

核心原因

错误根源是API包名迁移:Jakarta EE 8及以后版本将原javax.servlet包迁移到了jakarta.servlet,而使用的Shiro 1.10.0版本仍依赖旧的javax.servlet API,导致WildFly无法找到对应的类。

具体修复步骤

  1. 替换Shiro依赖为Jakarta兼容版本
    将原shiro-web依赖替换为Shiro官方提供的Jakarta兼容artifact,版本需使用1.11.0及以上(该版本开始支持Jakarta EE):

    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-web-jakarta</artifactId>
        <version>1.11.0</version>
    </dependency>
    

    同时移除原有的shiro-web依赖,避免冲突。

  2. 验证WildFly模块配置(可选)
    如果替换依赖后仍有问题,需确保WildFly的jakarta.servlet.api模块被应用正确引用:

    • 在项目的WEB-INF目录下创建jboss-deployment-structure.xml文件,内容如下:
      <?xml version="1.0" encoding="UTF-8"?>
      <jboss-deployment-structure>
          <deployment>
              <dependencies>
                  <module name="jakarta.servlet.api" export="true"/>
              </dependencies>
          </deployment>
      </jboss-deployment-structure>
      

    此配置明确让应用依赖WildFly提供的Jakarta Servlet API模块。

  3. 清理并重新构建部署

    • 执行mvn clean install清理旧的依赖文件,重新构建项目
    • 重新部署到WildFly服务器,观察是否仍有错误
补充说明

如果需要使用Shiro 2.x版本(完全基于Jakarta EE构建),可直接使用shiro-web依赖(2.x版本默认支持Jakarta):

<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-web</artifactId>
    <version>2.0.1</version>
</dependency>

内容的提问来源于stack exchange,提问作者Hassan Shaitou

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 09:20:41