3

我们正在将 WAR 文件部署到 Tomcat 5.5 中,如果 WEB-INF\classes 包含 .classes 文件,它可以正常工作,但是如果我们将包含该 .classes 的 .jar 文件移动到 WEB-INF\lib 中,我们会在运行时遇到异常抱怨 java.lang.NoSuchMethodError,但 .jar 文件中的现有类文件包含该类并且方法确实退出了!

对此的任何帮助将不胜感激。

4

4 回答 4

5

这可能是由于类冲突引起的。确保某处没有旧版本的 Class(Tomcat 的共享文件夹、WEB-INF/classes、WEB-INF/lib)。如果是这种情况,您实际上无法知道 Tomcat 将加载哪个类。如果它在没有该方法的情况下选择一个,则会发生您遇到的异常。

于 2009-07-07T10:23:43.140 回答
1

由于您得到的是 NoSuchMethodError,而不是 ClassNotFoundError,这意味着您在某处(在 jar 文件之外)有该类的旧版本。您需要找到并删除它。

于 2009-07-07T10:26:45.163 回答
0

这绝对是类 closin,请看这里http://tomcat.apache.org/tomcat-5.5-doc/class-loader-howto.html#Class%20Loader%20Definitions

如您所见,与 WEB-INF/lib 相比,WEB-INF/classes 下的类具有更高的优先级。您有两个具有相同名称(和包)的类。当其中一个在类文件夹中时,它具有更高的优先级。当它们都在 lib 文件夹中时,第二个首先获得(罐子根据它们的字母顺序具有优先级)

这可以解释你的情况。

希望它有所帮助——Yonatan

于 2009-07-08T12:11:50.410 回答
0

从 Web 应用程序的角度来看,类或资源加载按以下顺序查看以下存储库:

JVM
系统类加载器类的引导类(如上所述)
/WEB-INF/Web 应用程序 的类
/WEB-INF/lib/*.jar 您的 Web 应用程序
通用类加载器类(如上所述)

“通用类加载器”搜索的位置由 $CATALINA_BASE/conf/catalina.properties 中的 common.loader 属性定义。这是我们启用/定义共享位置的地方;
shared.loader=${catalina.base}/shared/classes,${catalina.base}/shared/lib/*.jar

上面的顺序可以更深入地了解您面临的问题。

于 2015-01-24T02:14:49.080 回答