【问题标题】:NoClassDefFoundError with Restlet AppEngine andJacksonRestlet AppEngine 和杰克逊的 NoClassDefFoundError
【发布时间】:2012-06-02 23:34:26
【问题描述】:

我在使用带有 Google App Engine 和 GWT 的 Restlet 时遇到了 NoClassDefFoundError。

我正在尝试获取我的对象的 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

【问题讨论】:

    标签: google-app-engine restlet


    【解决方案1】:

    另外,如果你查看你下载的 Restlet 版本的 lib 目录,你会看到一个 readme.txt,它会告诉你在使用各种 Restlet 扩展时需要包含的一些 jar。例如,readme.txt 应该有如下内容:

    org.restlet.ext.jackson(Restlet 扩展 - Jackson)

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

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

    【讨论】:

    • 是的......我自己来到了这个解决方案(答案如下),但我会接受你的回答,因为你会提供更好的细节。
    【解决方案2】:

    这与这里的问题类似:Objectify NoClassDefFoundError

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

    【讨论】:

    • 不... Jar 位于 WEB-INF/lib/ 文件夹中。
    【解决方案3】:

    我更新到 Restlet 2.0.14 并使用了它提供的 org.codehaus.jackson 库而不是网站上的库。

    这似乎解决了问题,虽然我不知道这两个动作中的哪一个实际上是这样做的。

    【讨论】:

      猜你喜欢
      • 2012-06-07
      • 1970-01-01
      • 2013-05-18
      • 2020-09-22
      • 2018-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多