struts Fedora TomCat 中的 2 个 NoSuchFieldError 原型

struts 2 NoSuchFieldError PROTOTYPE in TomCat on Fedora

一个团队正在开发 struts 应用程序。团队成员使用许多不同的操作系统。

我们正在使用 Java 8。目前,我使用的是 1.8。0_152-b16,但我已经使用 java 8 的多个版本进行了测试,包括 131 和 144。

我目前正在使用 TomCat 8.5.23,但也尝试过 8.0.20 和 9.0.1。

我通过解压 tar.gz 版本安装 TomCat,然后修改 tomcat-users.xml 文件。

部署是通过将 WAR 文件放到适当的位置来完成的。

在 Fedora 22 和 Fedora 26 上,我在本地主机日志文件中看到以下错误:

17-Oct-2017 17:06:13.077 SEVERE [localhost-startStop-1] org.apache.catalina.core.StandardContext.filterStart Exception starting filter [struts2]
 java.lang.NoSuchFieldError: PROTOTYPE
    at org.apache.struts2.config.DefaultBeanSelectionProvider.register(DefaultBeanSelectionProvider.java:389)
    at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reloadContainer(DefaultConfiguration.java:226)
    at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:67)
    at org.apache.struts2.dispatcher.Dispatcher.getContainer(Dispatcher.java:897)
    at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:437)
    at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:478)
    at org.apache.struts2.dispatcher.InitOperations.initDispatcher(InitOperations.java:75)
    at org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter.init(StrutsPrepareAndExecuteFilter.java:63)
    at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:285)
    at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:266)
    at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:108)
    at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4591)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5233)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:752)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:728)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:734)
    at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:988)
    at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1860)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

web.xml文件如下:

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
    <display-name>Struts 2 Web Application</display-name>

    <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>

我在较旧的 Fedora 22 计算机上看到此错误。然后我在新安装的 Fedora 26 上进行了测试。奇怪的是我可以毫无问题地将 WAR 文件放到 CENTOS、Ubuntu 和 Windows 7 上。我只在 Fedora 机器上看到这个错误。

我对struts不是很了解,但是我用了很久Java。

我理解 NoSuchFieldError 的含义,这让我怀疑正在使用的某个 jar 文件的版本不正确,但我觉得很奇怪,在 Fedora 上我看到错误,但在其他一些上却没有操作系统。

感谢任何诊断此问题的帮助。

似乎 /com/opensymphony/xwork2/inject/Scope.class 已被一个早于 2015 年 6 月 18 日的版本覆盖。根据 this commit,此时 DEFAULT 已更改为 PROTOTYPE,但它似乎加载了一个较旧的class。