使用jar文件而不是类的Tomcat部署问题

时间:2009-07-07 10:08:32

标签: java tomcat jar war

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

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

4 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

这是一个彻头彻尾的班级 请看这里http://tomcat.apache.org/tomcat-5.5-doc/class-loader-howto.html#Class%20Loader%20Definitions

正如您所看到的,WEB-INF / classes下的类与WEB-INF / lib相比具有更高的优先级。你有两个具有相同名称(和包)的类。当其中一个在classes文件夹中时,它具有更高的优先级。当他们都在lib文件夹中,然后第二个获得第一个(罐子的优先级基于他们的alpha-betical顺序)

这可以解释你的情况。

希望它有所帮助   - Yonatan

答案 3 :(得分:0)

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

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

" Common class loader"由$ CATALINA_BASE / conf / catalina.properties中的common.loader属性定义。这是我们启用/定义共享位置的地方;
shared.loader = $ {catalina.base} / shared / classes,$ {catalina.base} / shared / lib / * .jar

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