我有一个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服务器运行。
有没有人知道如何继续调试这个?
答案 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
。