Maven+Eclipse环境下Struts2配置冲突问题求解
问题场景
将遗留应用升级至Maven架构后,部署在WebSphere Application Server traditional 8.5.5上,使用Eclipse 4.16.0启动服务器,编译正常但访问Struts Web应用时出现500错误:
Error 500: javax.servlet.ServletException: Filter [struts2]: could not be initialized
服务器核心错误日志:
[30/05/23 10:37:26:986 BRT] 000000b6 webapp E com.ibm.ws.webcontainer.webapp.WebApp logServletError SRVE0293E: [Servlet Error]-[com.ibm.ws.webcontainer.extension.DefaultExtensionProcessor]: Unable to load configuration. - bean - wsjar:file:/C:/Users/DouglasCanevarollo/Desktop/ibm/evs/evs-maven/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/evs-ip-upload/WEB-INF/lib/struts2-core-6.1.2.jar!/struts-default.xml:116:72 at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:566) at org.apache.struts2.dispatcher.InitOperations.initDispatcher(InitOperations.java:48) at org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter.init(StrutsPrepareAndExecuteFilter.java:60) at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.init(FilterInstanceWrapper.java:145) ... Caused by: Bean type class com.opensymphony.xwork2.ObjectFactory with the name struts has already been loaded by bean - wsjar:file:/C:/Users/DouglasCanevarollo/.m2/repository/org/apache/struts/struts2-core/6.1.2/struts2-core-6.1.2.jar!/struts-default.xml:116:72 - bean - wsjar:file:/C:/Users/DouglasCanevarollo/Desktop/ibm/evs/evs-maven/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/evs-ip-upload/WEB-INF/lib/struts2-core-6.1.2.jar!/struts-default.xml:116:72 at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.register(XmlConfigurationProvider.java:263) ... 34 more
相关配置文件:
struts.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 6.0.//EN" "http://struts.apache.org/dtds/struts-6.0.dtd"> <struts> ... <!-- Package --> <package name="default" namespace="/protect" extends="struts-default"> <!-- Action Mappings --> <action name="uploadIpDb" method="runInit" class="com.ibm.comexp.ipupload.action.IPUploadAction" > <result>/home.jsp</result> </action> ... </package> </struts>
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp_ID" version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> ... <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
原因分析
日志明确显示com.opensymphony.xwork2.ObjectFactory类型的struts Bean被重复加载,来源是两份相同版本的struts2-core-6.1.2.jar——一份在本地Maven仓库,另一份在服务器临时部署目录的WEB-INF/lib中。这种重复加载导致Struts初始化时配置冲突,触发Filter初始化失败。
解决方案
排查并清理重复依赖
执行mvn dependency:tree命令生成项目依赖树,检查是否存在多路径引入struts2-core的情况。如果有,在Maven的<dependencies>中通过<exclusions>标签排除冗余依赖,确保仅保留一份struts2-core依赖。清理服务器临时部署目录
删除Eclipse服务器临时目录(路径为C:/Users/DouglasCanevarollo/Desktop/ibm/evs/evs-maven/.metadata/.plugins/org.eclipse.wst.server.core/tmp0),然后重新发布应用,彻底清除旧的jar包残留。调整WebSphere类加载策略
登录WebSphere控制台,找到目标应用的类加载设置,将类加载顺序修改为PARENT_LAST(应用类加载器优先)。这样应用自身WEB-INF/lib中的jar会优先被加载,避免与服务器类加载器中的重复类产生冲突。验证Eclipse部署配置
在Eclipse中打开服务器配置,检查「Deployment Assembly」选项,确保没有重复添加Maven依赖到部署目录。确认仅包含必要的项目资源和依赖项,无重复条目。
内容的提问来源于stack exchange,提问作者dcanevarollo

