2013-10-14 3 views
0

GAE에서 Jersey를 사용하여 웹 서비스를 노출하려고합니다.GAE에서 Jersey를 실행할 때 NoClassDefFoundError

[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) 

이 알려진 문제인가 :

나는 다음과 같은 오류는 무엇입니까? 그렇다면 해결 방법이 있습니까?

내가 메이븐을 사용하고하는 것은 다음 프로젝트

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

저지를 추가하려면 다음 종속성을 사용 나는 구성 제의 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> 

답변

1

java.misc.Unsafe가 아닌 App Engine의 Java 런타임에서 사용할 수 있습니다.

-1

런타임시 사용할 수 있도록 웹 응용 프로그램의 lib 폴더에 java.misc.Unsafe를 추가해야합니다.

또는 NetBeans 또는 다른 IDE를 사용하고 거기에서 REST 서비스를 만드는 것이 좋습니다. 그러면 필요한 라이브러리가 자동으로 구성되어 라이브러리 폴더에 추가됩니다.

마지막으로, 컴파일 할 때와 배포 할 때 올바른 JVM을 사용하고 있는지 확인하십시오.

2

방금 ​​같은 문제가 발생했습니다 : 모든 것이 저지 2.3.1에서 로컬로 작동하고 sun.misc.Unsafe 클래스로 인해 appengine이 중단됩니다. 이전 저지 버전으로 돌아가고 싶지 않았으므로 저지 소스를 확인하여이 패치를 찾을 수 있습니다. 나는 그들이 사실 ConcurrentHashMap (unsupprted 때) 또는 ConcurrentHashMapV8 (지원되는 경우)의 결과 JdkVersion.IS_UNSAFE_SUPPORTED 플래그를 기반으로 ConcurrentMap 구현을 실제로 선택했다는 것을 알았습니다. 그래서 나는

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와 잘 작동에 플래그를 설정하여 클래스 JdkVersion 패치) ​​

관련 문제