【问题标题】:Tomcat deployment problem using jar file instead of classesTomcat部署问题使用jar文件而不是类
【发布时间】:2010-11-08 15:40:54
【问题描述】:

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

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

【问题讨论】:

  • 能否提供完整的堆栈跟踪?
  • 是的,NoSuchMethodError 可能表明类正在被拾取,但它们符合旧版本的接口(或只是旧版本的隐式规范)。

标签: java tomcat jar war


【解决方案1】:

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

【讨论】:

  • 谢谢,问题是Lib文件夹中存在另一个jar文件(名称不同),由于文件名排序文件,tomcat首先拾取它。删除旧的 jar 文件修复了错误,这不足为奇:)
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    这无疑是类关闭 请看这里http://tomcat.apache.org/tomcat-5.5-doc/class-loader-howto.html#Class%20Loader%20Definitions

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

    这可以解释你的情况。

    希望对你有帮助 -- 约纳坦

    【讨论】:

      【解决方案4】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2016-07-15
        • 2012-12-16
        • 1970-01-01
        • 1970-01-01
        • 2018-12-05
        • 2013-05-03
        • 2017-03-24
        • 2015-04-18
        • 2015-02-08
        相关资源
        最近更新 更多