NoSuchMethodError - 从同一个包中的类调用类/方法

时间:2014-09-02 13:03:50

标签: java eclipse spring maven jodatime

我们正在将内部框架集成到我们的weblogic应用程序中,并且我们遇到了部署问题。

使用的技术

  • Weblogic 10.3.6应用程序
  • Spring 3.0
  • Maven 2
  • Eclipse J2EE

问题

在启动weblogic应用程序时,我们在初始化其中一个bean时收到以下NoSuchMethodError。在org.joda.time(2.0)jar中调用类时会发生此错误。

Caused By: java.lang.NoSuchMethodError: org.joda.time.DateTimeZone.convertLocalToUTC(JZ)J
      at org.joda.time.LocalDate.toDateTimeAtStartOfDay(LocalDate.java:715)
      at org.joda.time.LocalDate.toDateTimeAtStartOfDay(LocalDate.java:690)
      . . . excluded . . .

我们尝试过的事情

  • 在谷歌搜索" NoSuchMethodError spring"之后,许多问题似乎都是不兼容的Spring版本。打印依赖关系树后,使用的唯一Spring版本是3.0。

  • 谷歌搜索" NoSuchMethodError"通常给JAR地狱解决方案。

    • 相同依赖项的多个版本。在做了一些maven依赖管理之后,唯一使用的joda-time jar是2.0。此外,本地存储库清除了任何不必要的罐子。

    • .war / runtime可能没有包含在lib目录中的正确jar。查看WEB_INF / lib目录后,唯一的joda-time jar是2.0版,其中包含所有相应的类文件

一个神秘的事情是DateTimeZone.convertLocalToUTC(JZ)J自1.0以来一直是org.joda.time项目的一部分,所以即使我们有不兼容的版本,仍然应该找到该方法,特别是如果该类和包装都能找到。

最后项目中没有其他DateTimeZone类(在eclipse中按ctrl + shift + T搜索),所以如果没有加载org.joda.DateTimeZone类,我很困惑加载哪个类。

的问题:

  • 有谁可以解释为什么找不到该方法?
  • 是否有更多地方可以检查现有的或有冲突的罐子?
  • 有没有办法通过Eclipse调试检查LocalDate类在运行时使用的DateTimeZone类?

2 个答案:

答案 0 :(得分:2)

这里有一些有趣的读物:

  

prefer-web-inf-classes元素

     

weblogic.xml Web应用程序部署描述符包含一个    元素(元素的一个子元素)    元件)。默认情况下,此元素设置为   假。将此元素设置为True会颠覆类加载器   委托模型使类定义来自Web应用程序   优先加载到更高级别的类定义   类加载器。这允许Web应用程序使用自己的版本   第三方类,也可能是WebLogic Server的一部分。看到   “weblogic.xml部署描述符元素。”

取自:http://docs.oracle.com/cd/E15051_01/wls/docs103/programming/classloading.html

其他问题排查提示:

您可以尝试:-verbose:class并检查您的托管服务器的日志,以检查该类是否正确加载。

确认可能加载哪个侵入式jar的有效方法是在此应用程序的同一webcontext(即JVM实例)中运行whereis.jsp。

- whereis.jsp -

<%@ page import="java.security.*" %>
<%@ page import="java.net.URL" %>
<%
Class cls = org.joda.time.DateTimeZone.class;
ProtectionDomain pDomain = cls.getProtectionDomain();
CodeSource cSource = pDomain.getCodeSource();
URL loc = cSource.getLocation();
out.println(loc);
// it should print something like "c:/jars/MyJar.jar"
%>

您还可以在$ WEBLOGIC_HOME文件夹中尝试jarscan,看看是否可以找到包含此类的jar:https://java.net/projects/jarscan/pages/Tutorial

答案 1 :(得分:0)

NoSuchMethodError几乎总是由于冲突的库版本。在这种情况下,我猜测这两个项目中有多个版本的joda库。

Weblogic正在拉org.joda jar。

尝试在weblogic.xml中添加此内容以排除weblogic正在提取的jar,而是使用您的应用程序jar。

以下内容来自我的应用程序,您可以查看我们为应用程序删除的所有内容。

<wls:container-descriptor>
        <wls:prefer-application-packages>
            <wls:package-name>antlr.*</wls:package-name>
            <wls:package-name>org.slf4j.*</wls:package-name>
            <wls:package-name>org.slf4j.helpers.*</wls:package-name>
            <wls:package-name>org.slf4j.impl.*</wls:package-name>
            <wls:package-name>org.slf4j.spi.*</wls:package-name>
            <wls:package-name>org.hibernate.*</wls:package-name>
            <wls:package-name>org.springframework.*</wls:package-name>
            <wls:package-name>javax.persistence.*</wls:package-name>
            <wls:package-name>org.apache.commons.*</wls:package-name>
            <wls:package-name>org.apache.xmlbeans.*</wls:package-name>
            <wls:package-name>javassist.*</wls:package-name>
            <wls:package-name>org.joda.*</wls:package-name>
            <wls:package-name>javax.xml.bind.*</wls:package-name>
            <wls:package-name>com.sun.xml.bind.*</wls:package-name>
            <wls:package-name>org.eclipse.persistence.*</wls:package-name>
        </wls:prefer-application-packages>

        <wls:show-archived-real-path-enabled>true</wls:show-archived-real-path-enabled>
    </wls:container-descriptor>