NoClassDefFoundError with Restlet AppEngine andJackson



我得到一个NoClassDefFoundError,使用Restlet和Google App Engine和GWT。

我正在尝试获取我的对象的 Json 表示。我得到的错误是:

java.lang.NoClassDefFoundError: org/codehaus/jackson/JsonGenerator$Feature

我得到错误的方法的基本框架是:

@Get("json")
public Representation getProduct() {
    Product product = new Product("whatever");
    return new JacksonRepresentation<Product>(MediaType.APPLICATION_JSON, product);
}

最初,当仅使用 Restlet 提供的 JAR 时,我遇到了 JsonFactory 类的错误。然后我下载了'jackson-all-1.9.7.jar。此后,该错误已被此新错误所取代。

知道发生了什么吗?也许我缺少一些库,但我可以找出哪些库。

编辑:包括堆栈跟踪。我删除了所有库,然后用完了 Restlet org.restlet.ext.jackson JAR。此外,为了检查该类在编译时是否可用,正如下面的答案所暗示的那样,我尝试检查 Eclipse 中类和包的自动完成功能,但它没有显示任何内容。我假设这意味着它在编译时也不可用。

java.lang.NoClassDefFoundError: org/codehaus/jackson/JsonFactory
at org.restlet.ext.jackson.JacksonRepresentation.createObjectMapper(JacksonRepresentation.java:118)
at org.restlet.ext.jackson.JacksonRepresentation.getObjectMapper(JacksonRepresentation.java:164)
at org.restlet.ext.jackson.JacksonRepresentation.write(JacksonRepresentation.java:205)
at org.restlet.representation.WriterRepresentation.write(WriterRepresentation.java:104)
at org.restlet.engine.http.ServerCall.writeResponseBody(ServerCall.java:550)
at org.restlet.engine.http.ServerCall.sendResponse(ServerCall.java:488)
at org.restlet.ext.servlet.internal.ServletCall.sendResponse(ServletCall.java:492)
at org.restlet.engine.http.adapter.ServerAdapter.commit(ServerAdapter.java:197)
at org.restlet.engine.http.HttpServerHelper.handle(HttpServerHelper.java:151)
at org.restlet.ext.servlet.ServerServlet.service(ServerServlet.java:1028)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:35)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:60)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:122)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.BackendServersFilter.doFilter(BackendServersFilter.java:97)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
at com.google.appengine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:78)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:369)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:326)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:547)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
Caused by: java.lang.ClassNotFoundException: org.codehaus.jackson.JsonFactory
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at com.google.appengine.tools.development.IsolatedAppClassLoader.loadClass(IsolatedAppClassLoader.java:176)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 40 more

此外,如果您查看下载的 Restlet 版本的 lib 目录,您将看到一个自述文件.txt它将告诉您在使用各种 Restlet 扩展时需要包含的一些 jar。 例如,自述文件.txt应如下所示:

org.restlet.ext.jackson (Restlet Extension - Jackson)

  • org.codehaus.jackson.core_1.9
  • org.codehaus.jackson.mapper_1.9

因此,如果你将Jackson与Restlet(org.restlet.ext.jackson.jar一起使用,你还需要包括下面列出的另外两个jar。

这类似于这里的这个问题: Objectify NoClassDefFoundError

您需要将 jar 文件放在 WEB-INF/lib/下,并确保在构建路径中包含该库。对于线索,NoClassDefFound意味着该库在编译时可用,但在运行时不可用

我将 Restlet 2.0.14 更新为,并使用随附的 org.codehaus.jackson 库而不是网站上的库。

这似乎可以解决问题,尽管我不知道这两个操作中的哪一个实际上做到了这一点。

最新更新