错误“java.lang.NoSuchFieldError:WRITE_DURATIONS_AS_TIMESTAMPS”
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/34329418/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Error "java.lang.NoSuchFieldError: WRITE_DURATIONS_AS_TIMESTAMPS"
提问by user1927468
I'm working on Java Web Service with Maven depending on another java project. I will call the Web Service Project (Project 2), and the depending project (Project 1)
我正在使用 Maven 开发 Java Web 服务,具体取决于另一个 Java 项目。我将调用 Web 服务项目(项目 2)和依赖项目(项目 1)
So I have a "project 1" this project using "com.fasterxml.Hymanson.datatype.joda.JodaModule" jar. "Project 1" have this dependencies.
所以我有一个“项目 1”,这个项目使用“com.fasterxml.Hymanson.datatype.joda.JodaModule”jar。“项目 1”具有此依赖性。
<dependencies>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>19.0-rc2</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.12</version>
</dependency>
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.8.2</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.Hymanson.core</groupId>
<artifactId>Hymanson-core</artifactId>
<version>2.6.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.Hymanson.core</groupId>
<artifactId>Hymanson-annotations</artifactId>
<version>2.6.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.Hymanson.core</groupId>
<artifactId>Hymanson-databind</artifactId>
<version>2.6.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.Hymanson.datatype</groupId>
<artifactId>Hymanson-datatype-joda</artifactId>
<version>2.6.2</version>
</dependency>
<dependency>
<groupId>com.google.code.findbugs</groupId>
<artifactId>jsr305</artifactId>
<version>3.0.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>${powermock.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>${powermock.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.skyscreamer</groupId>
<artifactId>jsonassert</artifactId>
<version>1.2.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.yammer.dropwizard</groupId>
<artifactId>dropwizard-testing</artifactId>
<version>0.6.2</version>
<scope>test</scope>
</dependency>
</dependencies>
Now I need using "Project 1" in "project 2". So I write this code
现在我需要在“项目 2”中使用“项目 1”。所以我写了这段代码
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ObjectMapper mapper = new ObjectMapper();
mapper.setDateFormat(new ISO8601DateFormat());
mapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);
JodaModule module = new JodaModule();
mapper.registerModule(module);
}
but when I call the Post from the client. it give me this error.
但是当我从客户端调用 Post 时。它给了我这个错误。
Warning: StandardWrapperValve[Recieve]: Servlet.service() for servlet Recieve threw exception
java.lang.NoSuchFieldError: WRITE_DURATIONS_AS_TIMESTAMPS
at com.fasterxml.Hymanson.datatype.joda.ser.DurationSerializer.<init>(DurationSerializer.java:28)
at com.fasterxml.Hymanson.datatype.joda.ser.DurationSerializer.<init>(DurationSerializer.java:25)
at com.fasterxml.Hymanson.datatype.joda.JodaModule.<init>(JodaModule.java:45)
at Recieve.doPost(Recieve.java:82)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:318)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:415)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:282)
at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:459)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:167)
at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:201)
at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:175)
at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:235)
at org.glassfish.grizzly.filterchain.ExecutorResolver.execute(ExecutorResolver.java:119)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:284)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:201)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:133)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112)
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:561)
at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access0(WorkerThreadIOStrategy.java:56)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:565)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:545)
at java.lang.Thread.run(Thread.java:745)
Note: I try the same code in Maven Java Project not Maven Web Java Project, it is working in Maven java project.
注意:我在 Maven Java 项目而不是 Maven Web Java 项目中尝试相同的代码,它在 Maven java 项目中工作。
public class test {
public static void main(String[] args) {
ObjectMapper mapper = new ObjectMapper();
mapper.setDateFormat(new ISO8601DateFormat());
mapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);
JodaModule module = new JodaModule();
mapper.registerModule(module);
}
}
edit 1:
编辑1:
I was working on glassfish 4.1 and when I change the server to tomcat it works. so I think there is a conflict jars in glassfish. but till now I don't know how I can solve this conflict.
我正在研究 glassfish 4.1,当我将服务器更改为 tomcat 时,它可以工作。所以我认为 glassfish 中存在冲突 jars。但直到现在我不知道如何解决这个冲突。
回答by Gergely Bacso
This is caused by a dependency mismatch between Hymanson libs and joda.It is working for you when using only the original Maven module because it declares all the Hymanson libs as 2.6.2, which is correct. Your enclosing webapp surely uses some another Hymanson version either as direct or transitive dependency. That leads to incompatible jars being on your classpath.
这是由 Hymanson libs 和 joda 之间的依赖项不匹配引起的。当仅使用原始 Maven 模块时,它对您有用,因为它将所有 Hymanson 库声明为 2.6.2,这是正确的。您的封闭 web 应用程序肯定会使用另一个 Hymanson 版本作为直接或传递依赖项。这会导致您的类路径上存在不兼容的 jar。
To verify: just check your WEB-INF/lib and look for all libs that are Hymanson related. You will find non 2.6.2 versioned ones.
要验证:只需检查您的 WEB-INF/lib 并查找所有与 Hymanson 相关的库。你会发现非 2.6.2 版本的。
To fix: you need decide if you are able to upgrade to a new version on your webapp. Then configure your Maven dependencies accordingly.
修复:您需要决定是否能够在您的 web 应用程序上升级到新版本。然后相应地配置您的 Maven 依赖项。
回答by Marco Ferrari
It looks like a dependency conflict. Ensure that both projects load the same joda-time (and its dependencies) versions.
看起来像是依赖冲突。确保两个项目加载相同的 joda-time(及其依赖项)版本。
You can have a look at the dependency tree by running mvn dependency:tree
in command line or by having a look at the Dependency Hierarchypanel when opening the pom.xml with the POM editor in Eclipse.
您可以通过mvn dependency:tree
在命令行中运行或在 Eclipse 中使用 POM 编辑器打开 pom.xml 时查看Dependency Hierarchy面板来查看依赖关系树。