이 게시물의 길이는 변명의 여지가 있습니다. 나는 모든 유용한 정보를 얻고 사람들이 가질 수있는 의문을 예기하려고 노력하고 있습니다.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)
안녕하세요 jspyeatt! 저는 ServletHolder 부분의 코드를 사용하여 프로그래밍 방식으로 Android에 Jetty 내장 웹 서버가있는 Jersey 서블릿을 만들었습니다. 불행히도 예외가 발생합니다 : com.sun.jersey.api.container.ContainerException : WebApplication 공급자가 없습니다. 해결 방법에 대해 알고 있습니까? 감사! – Giorgio