我试图在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>
答案 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)
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。