我正在将一些旧的遗留应用程序升级到 Maven。这些应用程序在 WebSphere Application Server 传统 8.5.5 中运行,我使用 Eclipse 4.16.0 来运行 WAS 服务器。
它编译得很好,但是,当我尝试访问使用 Struts 构建的 Web 应用程序时,浏览器中出现以下错误消息:
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 配置文件:
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>
原因:名称为struts的Bean类型类com.opensymphony.xwork2.ObjectFactory已被加载
不要在类路径上两次使用同一个库
struts2-core-6.1.2.jar
。 struts 配置包含在这个库中的struts-default.xml
中。它应该只在 struts2 过滤器初始化时加载一次。部署应用程序后,从类路径中删除重复的库。
使用罗马答案,我设法通过将库放入 WEB-INF/lib 文件夹而不是 EAR lib 目录中来解决我的问题。