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

Kje*_*din 4 war jodatime nosuchmethoderror maven

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

执行这两行后我收到错误.虽然编译得很好.

DateTime firstDate = new DateTime();
firstDate = firstDate.withYear(2016);
Run Code Online (Sandbox Code Playgroud)

这是我的错误:

java.lang.NoSuchMethodError: org.joda.time.DateTime.withYear(I)Lorg/joda/time/DateTime;
Run Code Online (Sandbox Code Playgroud)

我知道,如果我编译并运行不同版本的库,就会发生这类错误,就像这个答案所说的那样,但withYear()自从2006年以来JodaTime 1.3已经存在,我无法看到我可以导入一个旧的版本.我甚至检查了我的最终war文件,并且唯一存在的JodaTime库是2.9.2.

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

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

use*_*849 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>
Run Code Online (Sandbox Code Playgroud)

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