jar文件导致java.lang.NoClassDefFoundError

时间:2017-03-14 05:28:19

标签: struts2

最近,我的同事辞职离开了公司。他使用struts2发现了一个java程序。但是,他只提供源代码。我没有也没有找到有关该计划的任何文件。不幸的是,我不擅长java或struts2,我想请你的意见。

我注意到该程序使用各种jar并且我相信程序使用struts正在使用Apache Struts2版本2.3.24.1,因为有一些名为struts2-core-2.3.24.1的jar,struts2-json-plugin-2.3.24.1,struts2 -spring-plugin-2.3.24.1和struts2-tiles-plugin-2.3.24.1。

我参考这三篇文章123,Apache Struts2有漏洞,我认为我必须将程序升级到版本2.3.32。

但是我没有信心立即升级到struts版本2.3.32,我备份整个程序并尝试升级到struts版本2.3.24.3,因为从wesite开始,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.yyyy-mm-dd.log,localhost_access_log.yyyy-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

我已阅读这些帖子,了解如何解决错误post1post2post3post4

但我不明白的一件事是我将版本从2.3.24.1应用到2.3.24.3。该程序没有错误。然后我做了类似的过程(将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。

以下是我在程序中添加的更新的jar文件,用于升级到struts版本2.3.32

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

虽然新的罐子和升级的罐子都放在程序中,但我仍然会遇到同样的错误。我对这个错误感到很困惑。

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

一般建议

JAR文件通常具有依赖关系,因此您不能(也不应该)在不知道其要求的情况下替换一个JAR。在这种情况下,较新的struts-tiles-plugin需要更新的tile依赖项。

在您手动执行此操作之前:有一个很好的工具可以帮助您,许多项目都会使用它。它被称为Maven。您的项目中是否有pom.xml?有了它,您可以非常轻松地处理所有这些依赖项。