0

我正在尝试在 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>

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

    <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

4 回答 4

2

我刚刚遇到了同样的问题:一切都在 jersey 2.3.1 本地工作,并且由于 sun.misc.Unsafe 类而在 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;

有了这个,我的应用程序可以在 appengine 上与球衣 2.3.1 一起正常工作;)

于 2013-10-25T07:17:44.200 回答
1

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

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

根据我的经验,Jersey 1.17 工作正常。

于 2013-10-24T13:12:10.260 回答
1

java.misc.Unsafe在 App Engine 上的 Java 运行时中不可用。

于 2013-10-14T02:05:10.700 回答
-1

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

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

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

于 2013-10-14T09:30:25.030 回答