【问题标题】:NoSuchFieldError: INCLUDE_ALLNoSuchFieldError: INCLUDE_ALL
【发布时间】:2014-05-27 16:50:12
【问题描述】:

我在 GAE 上使用带有 Spring 的 Jersey。
我得到以下异常:

Uncaught exception from servlet
java.lang.NoSuchFieldError: INCLUDE_ALL
    at org.glassfish.jersey.server.ResourceConfig$State.<init>    (ResourceConfig.java:110)
    at org.glassfish.jersey.server.ResourceConfig.<init>(ResourceConfig.java:351)
    at org.glassfish.jersey.server.ResourceConfig$WrappingResourceConfig.<init>(ResourceConfig.java:1014)
    at org.glassfish.jersey.server.ResourceConfig.forApplicationClass(ResourceConfig.java:325)
    at org.glassfish.jersey.servlet.WebComponent.createResourceConfig(WebComponent.java:442)
    at org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:294)
    at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:167)
    at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:349)
    at javax.servlet.GenericServlet.init(GenericServlet.java:212)
    at org.mortbay.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:440)
    at org.mortbay.jetty.servlet.ServletHolder.doStart(ServletHolder.java:263)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:685)
    at org.mortbay.jetty.servlet.Context.startContext(Context.java:140)
    at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1250)
    at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:517)
    at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:467)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.createHandler(AppVersionHandlerMap.java:219)
    at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.getHandler(AppVersionHandlerMap.java:194)
    at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:134)
    at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:446)
    at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:437)
    at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:444)
    at com.google.tracing.CurrentContext.runInContext(CurrentContext.java:188)
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:308)
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:300)
    at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:441)
    at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:251)
    at java.lang.Thread.run(Thread.java:724)

查看泽西代码,我发现这是抛出异常:

    public State() {
        super(RuntimeType.SERVER, ComponentBag.INCLUDE_ALL);

查看“ComponentBag”,我可以看到在运行时找不到的公共字段。

public static final Predicate<ContractProvider> INCLUDE_ALL = Predicates.alwaysTrue();

在“State”构造函数中,在运行时找不到“ComponentBag”的“INCLUDE_ALL”字段。
它看起来像一个类路径问题,但我找不到问题所在。
我正在使用 Maven - 这是我的 POM 的相关部分。

   ... 
<properties>
    <appengine.app.version>5</appengine.app.version>
    <appengine.target.version>1.8.9</appengine.target.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <jersey.version>2.7</jersey.version>
    <spring.version>3.2.3.RELEASE</spring.version>
</properties>
   ...
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${spring.version}</version>
    <exclusions>
        <exclusion>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>${spring.version}</version>
</dependency>

<dependency>
    <groupId>org.glassfish.jersey.ext</groupId>
    <artifactId>jersey-spring3</artifactId>
    <version>${jersey.version}</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <version>${jersey.version}</version>
</dependency>
    ...

【问题讨论】:

  • 你解决了吗?我在 AWS Lambda 上遇到了同样的错误

标签: java spring google-app-engine maven jersey-2.0


【解决方案1】:

如果有人偶然发现了这个问题(或者如果它仍然相关),我发现在命令行 VM 选项中添加 -verbose:class 可以帮助您找出这个异常的确切来源。

ResourceConfig 来自 jersey-server-2.22.1.jar。 我已经通过从 WEB-INF/lib 中删除我的所有 jar 并从 maven 添加它们来解决这个问题。

【讨论】:

    【解决方案2】:

    确保您使用相同版本的 jersey 客户端、服务器和通用库(例如 2.22.1)

    【讨论】:

      【解决方案3】:

      明确地包含这个库解决了这个问题

          <dependency>
              <groupId>org.glassfish.jersey.core</groupId>
              <artifactId>jersey-server</artifactId>
              <version>2.32</version>
          </dependency>
      

      【讨论】:

        【解决方案4】:

        去除Multipart文件上传的依赖

        【讨论】:

        • 这看起来更像是评论而不是答案。
        【解决方案5】:

        我发现有两个jar有ResourceConfig:hbase-shaded-testing-util和jersey-server,所以我在pom.xml中排除了hbase-shaded-testing-util,然后问题解决了。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-01-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-12
          • 1970-01-01
          相关资源
          最近更新 更多