为什么我在JodaTime.withYear()上得到NoSuchMethodError?

时间:2016-03-09 12:17:00

标签: maven war jodatime nosuchmethoderror

我有一个maven web app项目,我使用JodaTime。 JodaTime不是在我的maven项目中直接引用的,而是传递依赖项的一部分。换句话说,我的网络应用程序战争,我的另一个项目作为直接依赖,并且该jar包含JodaTime。

执行这两行后我收到错误。它编译得很好。

DateTime firstDate = new DateTime();
firstDate = firstDate.withYear(2016);

这是我的错误:

java.lang.NoSuchMethodError: org.joda.time.DateTime.withYear(I)Lorg/joda/time/DateTime;

我知道如果我编译并运行不同版本的库(例如this answer says)会发生这类错误,但是自{2006}以来我自JodaTime 1.3以来一直存在withYear()无法看到我曾经导入过旧的版本。我甚至检查了我的最终war文件,并且唯一存在的JodaTime库是2.9.2。

如果我创建一个main-method片段,并且在eclipse中的同一个项目中运行它,那么这两行就可以了。它们只在编译成war文件时失败,并从我的weblogic 10.3.2服务器运行。

有没有人知道如何继续调试这个?

1 个答案:

答案 0 :(得分:11)

WebLogic 10.3.6在类路径中包含此内容:

joda.time_1.2.1.0.jar

这比缺少方法的1.3早。

您的代码已编译,这表明您的应用程序的类路径至少具有Joda 1.3。

因此我怀疑这是一个WebLogic类路径问题。当您的应用程序使用同样位于WebLogic类路径上的库时,您需要告诉WebLogic使用哪个库。您可以使用prefer-application-packages中的src/main/webapp/WEB-INF/weblogic.xml元素执行此操作。

<weblogic-web-app xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.oracle.com/weblogic/weblogic-web-app
http://xmlns.oracle.com/weblogic/weblogic-web-app/1.3/weblogic-web-app.xsd">

  <context-root>myApp</context-root>
  <container-descriptor>
    <prefer-application-packages>
      <package-name>org.joda.time.*</package-name>
      <package-name>org.slf4j.*</package-name>
      <package-name>org.slf4j.impl.*</package-name>
      <package-name>org.slf4j.spi.*</package-name>
      <!-- others here -->
    </prefer-application-packages>
  </container-descriptor>

  <!-- rest of weblogic.xml here -->
</weblogic-web-app>

WebLogic有一个名为wls-cat的类路径分析工具,可帮助找到这些冲突,如this blog post中所述。一个警告 - 不要只是将wls-cat的prefer-application-packages块复制到您的webapp中并认为您已完成 - 您需要逐个解决每个冲突。有时这意味着从您的webapp中排除依赖关系或使用范围provided