为什么我在 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
.
我有一个 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
.