JDK11升17迁移Jakarta后,AxisHTTPSessionListener替代方案及报错解决
解决AxisHTTPSessionListener在JDK17+Jakarta迁移中的NoClassDefFoundError问题
问题背景
你在web.xml中配置了Axis的会话监听器:
<listener> <listener-class>org.apache.axis.transport.http.AxisHTTPSessionListener</listener-class> </listener>
升级JDK11到17并迁移javax到jakarta后,由于该监听器依赖javax.servlet.http下的类:
package org.apache.axis.transport.http; import java.util.Enumeration; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; import javax.xml.rpc.server.ServiceLifecycle; import org.apache.axis.components.logger.LogFactory; import org.apache.commons.logging.Log; public class AxisHTTPSessionListener implements HttpSessionListener { // 原类实现 }
出现如下错误:
Error configuring application listener of class [org.apache.axis.transport.http.AxisHTTPSessionListener] ([/test].log) java.lang.NoClassDefFoundError: javax/servlet/http/HttpSessionListener
解决方案
方案一:使用Jakarta兼容的Axis分支版本
官方Apache Axis 1.x未提供Jakarta EE兼容版本,但社区有移植的分支包(如axis-jakarta)。
- 若使用Maven/Gradle,将原Axis依赖替换为Jakarta兼容版本,例如:
<!-- Maven示例 --> <dependency> <groupId>org.apache.axis</groupId> <artifactId>axis-jakarta</artifactId> <version>1.4.1-jakarta</version> </dependency> - 该版本的
AxisHTTPSessionListener已将导入替换为jakarta.servlet.http相关类,无需修改web.xml配置即可兼容。
方案二:手动编写适配监听器
如果找不到合适的兼容包,可自行修改监听器代码适配Jakarta:
- 复制原
AxisHTTPSessionListener的全部代码,创建自定义类,将所有javax.servlet.http导入替换为jakarta.servlet.http:package com.your.custom.package; import java.util.Enumeration; import jakarta.servlet.http.HttpSession; import jakarta.servlet.http.HttpSessionEvent; import jakarta.servlet.http.HttpSessionListener; import jakarta.xml.rpc.server.ServiceLifecycle; // 需引入Jakarta XML RPC API依赖 import org.apache.axis.components.logger.LogFactory; import org.apache.commons.logging.Log; public class JakartaAxisHTTPSessionListener implements HttpSessionListener { // 完全复制原AxisHTTPSessionListener的方法实现 } - 引入Jakarta相关依赖:
<!-- Jakarta Servlet API --> <dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>6.0.0</version> <scope>provided</scope> </dependency> <!-- Jakarta XML RPC API(若需要) --> <dependency> <groupId>jakarta.xml.rpc</groupId> <artifactId>jakarta.xml.rpc-api</artifactId> <version>2.0.0</version> </dependency> - 修改web.xml中的监听器配置为自定义类:
<listener> <listener-class>com.your.custom.package.JakartaAxisHTTPSessionListener</listener-class> </listener>
方案三:移除监听器(若业务不需要)
AxisHTTPSessionListener的作用是清理与HttpSession绑定的Axis服务实例。如果你的项目未使用会话绑定的Axis服务,可以直接删除web.xml中的该监听器配置,彻底避免该错误。
内容的提问来源于stack exchange,提问作者Remo
相关产品推荐
相关产品推荐

