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

Why do I get a NoSuchMethodError on JodaTime.withYear()?

我有一个 Maven 网络应用程序项目,我在其中使用了 JodaTime。 JodaTime 在我的 maven 项目中没有直接引用,而是传递依赖的一部分。换句话说,我的网络应用程序 war 有我的另一个项目作为直接依赖项,并且那个 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 编译和 运行 可能会发生这些类型的错误,但是 withYear() 自 JodaTime 1.3 以来一直存在,自 2006 年以来,我看不出我可以导入那么旧的版本。我什至检查了我的最终 war 文件,唯一存在的 JodaTime 库是 2.9.2.

如果我在 eclipse 中的同一个项目中创建一个主方法片段,那么这两行 运行 没问题,运行 它。它们只会在编译成 war 文件时失败,并且 运行 从我的 weblogic 10.3.2 服务器上运行。

有人知道我该如何继续调试这个吗?

WebLogic 10.3.6 在类路径中包含:

joda.time_1.2.1.0.jar

这是早于缺少方法的 1.3。

您的代码可以编译,这很好地表明您的应用程序的类路径至少有 Joda 1.3。

因此我怀疑这是一个 WebLogic 类路径问题。当您的应用程序使用也在 WebLogic 类路径上的库时,您需要告诉 WebLogic 要使用哪个库。您可以使用 src/main/webapp/WEB-INF/weblogic.xml.

中的 prefer-application-packages 元素执行此操作
<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.