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无法找到对应的类。
具体修复步骤
替换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依赖,避免冲突。验证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模块。
- 在项目的
清理并重新构建部署
- 执行
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
相关产品推荐
相关产品推荐

