2011-01-13 2 views
3

이 게시물의 길이는 변명의 여지가 있습니다. 나는 모든 유용한 정보를 얻고 사람들이 가질 수있는 의문을 예기하려고 노력하고 있습니다.Proguard-obfuscated REST 서비스로 작동하는 Jersey JAX-RS 리소스를 가져올 수 없습니다.

저는 Jersey로 구현되어 Jetty에서 실행되는 일련의 RESTful 웹 서비스를 제공합니다. jar 파일의 모호하지 않은 버전에서는 모든 것이 잘 작동합니다. 내가 Proguard와 함께 당황 때는하지만 난 그냥 내가 연결 및 기본 저지 구성을 테스트 할 수있는 매우 간단한 핑 서비스를 내 패키지의 일부로서 메시지

The ResourceConfig instance does not contain any root resource classes. 

에 500 오류가 발생합니다. 저지 부두를 시작

내 코드는 다음과 같습니다

ServletHolder sh = new ServletHolder(ServletContainer.class); 
sh.setInitParameter("com.sun.jersey.config.property.packages", "com.sw.pr.hq"); 
sh.setInitParameter("com.sun.jersey.config.property.resourceConfigClass", 
      "com.sun.jersey.api.core.PackagesResourceConfig"); 
ServletContextHandler sch = new ServletContextHandler(server, "/pr"); 
sch.addServlet(sh, "/"); 

내가 디버그 로그는 다음과 같은 라인을 보여줍니다 브라우저에서 내 핑 URL을 공격하려고 : 그래서

Jan 13, 2011 9:33:35 AM com.sun.jersey.api.core.PackagesResourceConfig init 
[java] INFO: Scanning for root resource and provider classes in the packages: 
[java] com.sw.pr.hq 

을 부두가 올바르게 구성되어 실행 중입니다. 내가 말했듯이,이 응용 프로그램의 un-obfuscated 버전은 정상적으로 작동합니다. 내가 핑하려고 할 때 나타납니다

스택 추적은 본 게시물의 하단에 표시하지만, 가장 골치 라인은 다음과 같습니다

[java] SEVERE: The ResourceConfig instance does not contain any root resource classes. 
[java] 2011-01-13 09:33:35.585:WARN:/pr:unavailable 

내 난독 구성이 (간결함을 제거 댓글)처럼 보인다. jar -tvf obfuscated.jar 호출을 수행 할 때 클래스 com.sw.pr.HQServerResource.class 파일이 표시됩니다.

-dontskipnonpubliclibraryclasses 
-renamesourcefileattribute SourceFile 
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod 
-overloadaggressively 
-repackageclasses com.sw.rtm 
-adaptresourcefilenames **.properties,**.png,**.css 
-adaptresourcefilecontents **.properties,META-INF/MANIFEST.MF 
-keep public class * { 
    public *; 
} 
-keepclassmembernames class * { 
    java.lang.Class class$(java.lang.String); 
    java.lang.Class class$(java.lang.String, boolean); 
} 
-keepclassmembers enum * { 
    public static **[] values(); 
    public static ** valueOf(java.lang.String); 
} 

내 핑 자원 클래스는 다음과 같습니다

@Path("/") 
public class HQServerResource { 
    @GET 
    @Produces(MediaType.APPLICATION_XML) 
    @Path("/ping") 
    public PingResponse pingGet(@Context HttpServletRequest httpRequest) { 
     LOGGER.debug("pingGet()"); 
     return getPingResponse(httpRequest); 
    } 
} 

지금 내가 인해 Proguard와 내 익숙 내 추측의 단계로 들어갑니다.

필자의 문제는 Proguard가 내 클래스 파일에서 @Path 주석을 매싱하는 것입니다. 하지만 내 proguard 구성 파일에 지시문 (-keepattributes Annotation)이 있습니다. 그러므로 나는 이제 잃어버린 자다.

모든 안내를 받으실 수 있습니다.

스택 추적 :

[자바] com.sun.jersey.api.container.ContainerException 다음 ResourceConfig 인스턴스가 어떤 루트 자원 클래스가 포함되어 있지 않습니다. com.sun.jersey.server.impl.application.RootResourceUriRules. [RootResourceUriRules.java:103]에서 [java] [java] at com.sun.jersey.server.impl.application.WebApplicationImpl._initiate (WebApplicationImpl.java) : 1182) com.sun.jersey.server.impl.application.WebApplicationImpl.access에서 [java] $ 600 (WebApplicationImpl.java:161) com.sun.jersey.server.impl.application.WebApplicationImpl에서 [java] [java] .f (WebApplicationImpl.java:698) com.sun.jersey.server.impl.application.WebApplicationImpl의 [java] com.sun.jersey.spi의 [java]. inject.Errors.processWithErrors (Errors.java:197) [java] at com.sun.jersey.server.impl.application.WebApplicationImpl.initiate (WebApplicationImpl.java:695) [java] at com.sun.jersey.server.impl.application.WebApplicationImpl.initiate (WebApplicationImpl.java:690) [java] at com. (ServletContainer.java : 288) [java] [java] at com.sun.jersey.spi.container.servlet.WebComponent.load (WebComponent.java:587) [java] at com.sun.jersey.spi.container.servlet.WebComponent.init (WebComponent.java) : 213) com.sun.jersey.spi.container.servlet.ServletContainer.init (ServletContainer.java:342)의 [java] [java] at com.sun.jersey.spi.container.servlet.ServletContainer.init (ServletContainer.jav a : 516) javax.servlet.GenericServlet.init (GenericServlet.java:211) 에서 [java] [java] org.eclipse.jetty.servlet.ServletHolder.initServlet (ServletHolder.java:431) [java] org.eclipse.jetty.servlet.ServletHolder.handle에서 org.eclipse.jetty.servlet.ServletHolder.getServlet (ServletHolder.java:330) [자바] (ServletHolder.java:510)

+0

안녕하세요 jspyeatt! 저는 ServletHolder 부분의 코드를 사용하여 프로그래밍 방식으로 Android에 Jetty 내장 웹 서버가있는 Jersey 서블릿을 만들었습니다. 불행히도 예외가 발생합니다 : com.sun.jersey.api.container.ContainerException : WebApplication 공급자가 없습니다. 해결 방법에 대해 알고 있습니까? 감사! – Giorgio

답변

8

에서 나는 믿습니다 내가 가지고 있던 문제를 추적했다. 문제는 proguard가 기본적으로 난독 화 된 jar 파일에 디렉토리 항목을 포함하지 않는다는 것입니다.

그래서 난독 화 된 jar 파일 내용이 이와 유사합니다.

com/sw/pr/hq/HQServerResource.class 
com/sw/pr/hq/a.class 
com/sw/pr/hq/a.class 

참고 : 디렉토리 항목이 없습니다.

-keepdirectory 지시어를 내 proguard 파일에 추가하면 난독 화 된 jar 파일이 다음과 같이 보입니다.

com/ 
com/sw/ 
com/sw/pr/ 
com/sw/pr/hq/ 
com/sw/pr/hq/HQServerResource.class 
com/sw/pr/hq/a.class 
com/sw/pr/hq/a.class 

이 작업이 완료되면 서블릿은 내 @Path 주석이있는 리소스를 찾는 디렉토리를 탐색 할 수 있습니다.

통증이있는 ​​피의 지시.

관련 문제