Struts2 jar文件导致java.lang.NoClassDefFoundError

Struts2 jar文件导致java.lang.NoClassDefFoundError,struts2,Struts2,最近,我的同事辞职离开了公司。他用struts2移交了一个java程序。但是,他只提供源代码。我没有也没有找到任何关于这个项目的文件。不幸的是,我不擅长java或struts2,我想征求您的意见 我注意到程序使用了各种JAR,我相信使用struts的程序使用的是ApacheStruts2版本2.3.24.1,因为有些JAR称为Struts2-core-2.3.24.1、Struts2-json-plugin-2.3.24.1、Struts2-spring-plugin-2.3.24.1和Stru

最近,我的同事辞职离开了公司。他用struts2移交了一个java程序。但是,他只提供源代码。我没有也没有找到任何关于这个项目的文件。不幸的是,我不擅长java或struts2,我想征求您的意见

我注意到程序使用了各种JAR,我相信使用struts的程序使用的是ApacheStruts2版本2.3.24.1,因为有些JAR称为Struts2-core-2.3.24.1、Struts2-json-plugin-2.3.24.1、Struts2-spring-plugin-2.3.24.1和Struts2-tiles-plugin-2.3.24.1

我参考了这3篇文章,Apache Struts2存在漏洞,我想我必须将程序升级到2.3.32版

但是我没有信心立即升级到struts版本2.3.32,我备份了整个程序并尝试升级到struts版本2.3.24.3,因为从这一点来看,2.3.24.1的下一个版本是2.3.24.3。此外,我尽量不更改程序中的任何代码,因此我首先开始升级jar文件

由于有很多jar文件,这里是我为struts2版本2.3.24.3升级的jar文件

javassist-3.11.0.GA
ognl-3.0.6.1
struts2-core-2.3.24.3
struts2-dojo-plugin-2.3.24.3
struts2-json-plugin-2.3.24.3
struts2-spring-plugin-2.3.24.3
struts2-tiles-plugin-2.3.24.3
xwork-core-2.3.24.3
我清理项目并运行程序。它运行正常(没有异常发生),因此我开始将jars文件从2.3.24.3升级到2.3.32

现在这里是我在程序中添加的升级jar文件,以前的版本已经被删除。其余的罐子保持不变

struts2-core-2.3.32
struts2-dojo-plugin-2.3.32
struts2-json-plugin-2.3.32
struts2-spring-plugin-2.3.32
struts2-tiles-plugin-2.3.32
我清理项目并运行程序。这是关于java.lang.NoClassDefFoundError的错误

这里是错误。我感到奇怪的是,还有“…19条”,但我找不到这19条信息。我搜索日志文件,例如catalina.yyy-mm-dd.log、localhost\u access\u log.yyy-mm-dd/txt。令人惊讶的是,这些日志文件包含两天前的日志

SEVERE: Error configuring application listener of class    org.apache.struts2.tiles.StrutsTilesListener
java.lang.NoClassDefFoundError:    org/apache/tiles/web/startup/AbstractTilesListener
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2472)
at  org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase .java:854)
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1274)
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1157)
at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:520)
at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:501)
at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:120)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4651)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5167)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1409)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1399)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.ClassNotFoundException: org.apache.tiles.web.startup.AbstractTilesListener
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1305)
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1157)
... 19 more

Mar 14, 2017 11:58:38 AM org.apache.catalina.core.StandardContext listenerStart
SEVERE: Skipped installing application listeners due to previous error(s)
Mar 14, 2017 11:58:38 AM org.apache.catalina.core.StandardContext startInternal
SEVERE: One or more listeners failed to start. Full details will be found in the appropriate container log file
Mar 14, 2017 11:58:38 AM org.apache.catalina.core.StandardContext startInternal
SEVERE: Context [/RIDW] startup failed due to previous errors
Mar 14, 2017 11:58:38 AM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-nio-8080"]
Mar 14, 2017 11:58:38 AM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["ajp-nio-8009"]
Mar 14, 2017 11:58:38 AM org.apache.catalina.startup.Catalina start
INFO: Server startup in 6698 ms
我读过这些关于如何解决错误的帖子,还有

但有一件事我不明白,当我为2.3.24.1到2.3.24.3版本应用JAR时。程序没有错误。然后我执行类似的过程(将JAR从2.3.24.3更改为2.3.32),程序在运行时出错。在这两个过程中,我不编写或编辑程序中的任何代码,我只是更改jar文件

所以,我是否应该比较每个jar文件2.3.24.1到2.3.24.3,并找到不同的jar,然后使用这些不同的jar与原始程序jar进行比较以修复错误?谢谢你的建议。非常感谢。(请注意,如果此帖子不适合在此发布,是否有人可以帮我删除它。谢谢)

更新

我花了很多时间下载JAR并找到pom.xml文件。但是该文件在程序中不存在,因此我认为该程序需要手动添加或删除JAR

下面是我在升级到struts版本2.3.32的程序中添加的更新JAR

struts2-core-2.3.32
struts2-dojo-plugin-2.3.32
struts2-json-plugin-2.3.32
struts2-spring-plugin-2.3.32
struts2-tiles-plugin-2.3.32
commons-beanutils-1.8.0
commons-collections-3.2.2
commons-fileupload-1.3.2
commons-io-2.2
commons-logging-1.1.3
javassist-3.11.0.GA
jcl104-over-slf4j-1.5.8
ognl-3.0.19
slf4j-api-1.7.12
slf4j-jdk14-1.5.8
spring-test-3.0.5.RELEASE
spring-web-3.0.5.RELEASE
tiles-api-2.2.2
tiles-core-2.2.2
tiles-jsp-2.2.2
虽然新的JAR和升级的JAR都放在了程序中,但我仍然会遇到同样的错误。我对这个错误感到很困惑

如果我将版本从2.3.24.1升级到2.3.24.3。该程序似乎很好(我还没有测试任何功能,我只是启动服务器,它可以打开程序的第一页)

但如果我将版本从2.3.24.1升级到2.3.32,服务器将无法正常启动并显示错误


另一件让我感到奇怪的事情是错误仍然是一样的,没有新的错误(可能还没有发生)

我建议您在升级任何JAR文件之前阅读

在您的情况下,您至少错过了版本中的一个重要的内部更改,在该版本中,tiles插件被更新为此时可用的最新版本。(错误
java.lang.NoClassDefFoundError:org/apache/tiles/web/startup/AbstractTilesListener

一般建议

JAR文件通常具有依赖性,因此您不能(也不应该)在不了解其需求的情况下替换一个JAR。在这种情况下,更新的struts tiles插件需要更新的tiles依赖项


在您手动完成这一切之前:有一个很好的工具可以帮助您,许多项目都使用它。它叫。您的项目中是否有
pom.xml
?有了它,您可以非常轻松地处理所有这些依赖项。

将Apache Tiles更新为
2.2.2
@AleksandrM,谢谢您的评论。我在程序中添加了ApacheTiles 2.2.2。当我启动服务器时,仍然会出现相同的错误。我觉得奇怪,我在瓷砖上也犯了同样的错误。如果出现新错误,我可能会跟踪该错误以尝试修复问题,但错误是相同的。谢谢您的回答和建议。我添加了新的jar和升级的jar,但我得到了相同的错误。我觉得奇怪,我在瓷砖上也犯了同样的错误。如果出现新错误,我可能会跟踪该错误以尝试修复该问题,但错误是相同的。