我们正在将内部框架集成到我们的weblogic应用程序中,并且我们遇到了部署问题。
使用的技术
问题
在启动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类,我很困惑加载哪个类。
的问题:
答案 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>