在GAE中运行Jersey时的NoClassDefFoundError

时间:2013-10-14 01:19:47

标签: java google-app-engine jersey jax-rs

我试图在GAE中使用Jersey公开Web服务。

我收到以下错误:

[INFO] java.lang.NoClassDefFoundError: sun.misc.Unsafe is a restricted class. Please see the Google  App Engine developer's guide for more details.
[INFO]  at com.google.appengine.tools.development.agent.runtime.Runtime.reject(Runtime.java:51)
[INFO]  at org.glassfish.jersey.internal.util.collection.ConcurrentHashMapV8.getUnsafe(ConcurrentHashMapV8.java:3502)
[INFO]  at org.glassfish.jersey.internal.util.collection.ConcurrentHashMapV8.<clinit>(ConcurrentHashMapV8.java:3467)
[INFO]  at org.glassfish.jersey.internal.util.collection.DataStructures.createConcurrentMap(DataStructures.java:237)
[INFO]  at org.glassfish.jersey.message.internal.MessageBodyFactory.<init>(MessageBodyFactory.java:197)

这是一个已知问题吗?如果是,是否有解决方法?

我正在使用Maven并使用以下依赖项将Jersey添加到项目中

<dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-servlet</artifactId>
    <version>2.3.1</version>
</dependency>

以下是我在web.xml中配置Jersey的部分:

    <servlet>
        <servlet-name>Jersey Web Application</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>com.mycompany.myapplication</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

4 个答案:

答案 0 :(得分:2)

我刚刚遇到了同样的问题:由于sun.misc.Unsafe类,所有东西都在球衣2.3.1本地工作,并打破了appengine。 我不想回到较旧的球衣版本,所以我检查了球衣来源,可能会找到一个补丁。我发现了,他们 实际上选择了基于标志JdkVersion.IS_UNSAFE_SUPPORTED的ConcurrentMap实现,导致ConcurrentHashMap(当不匹配时) 或ConcurrentHashMapV8(支持时)。 所以我通过删除

修补了JdkVersion类
static {

  boolean isUnsafeFound;

  try {
    isUnsafeFound = Class.forName("sun.misc.Unsafe") != null;
  } catch (Throwable t) {
    isUnsafeFound = false;
  }

  IS_UNSAFE_SUPPORTED = isUnsafeFound;
}

并将标志设置为

private static final boolean IS_UNSAFE_SUPPORTED = false;

有了这个,我的应用程序可以正常使用引擎上的球衣2.3.1;)

答案 1 :(得分:1)

App Engine上的Java运行时中没有

java.misc.Unsafe

答案 2 :(得分:1)

您需要使用旧版本的Jersey,因为版本2与GAE不兼容。

版本1.5被Google列为兼容:https://code.google.com/p/googleappengine/wiki/WillItPlayInJava

根据我的经验,泽西岛1.17运作良好。

答案 3 :(得分:-1)

您应该将java.misc.Unsafe添加到Web应用程序的lib文件夹中,以便它在运行时可用。

或者我建议您使用NetBeans或任何其他IDE并从那里创建REST服务,它会自动配置所需的库并将它们添加到库文件夹中。

最后,在编译和部署时检查您是否使用了正确的JVM。