2011-01-13 83 views
3

请原谅本帖的篇幅。我试图获得所有有用的信息,并预测人们可能会遇到的问题。使用Proguard-obfuscated REST服务无法获得Jersey JAX-RS资源

我有一系列REST风格的Web服务已经用Jersey实现并在Jetty中运行。 一切工作正常与jar文件的未混淆的版本。但是,当我使用ProGuard混淆我得到一个500错误与消息

The ResourceConfig instance does not contain any root resource classes. 

由于我的包的一部分,我有一个非常简单的ping服务,这样我可以测试连通性和基本配置新泽西州。

我与球衣启动码头代码如下所示:

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, "/"); 

当我尝试从浏览器的调试日志显示以下行打我ping网址:

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 

所以我认为jetty已正确配置并正常运行。就像我说的,这个应用程序的未混淆的版本工作正常。

当我尝试平出现的堆栈跟踪出现在这个帖子底部,但最麻烦的路线是:

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

我ProGuard的配置看起来像这样(注释为简洁起见删除)。请注意,当我做一个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 注释)。因此,我现在失去了。

任何指导将不胜感激。

堆栈跟踪:

【JAVA] com.sun.jersey.api.container.ContainerException:本ResourceConfig实例不包含任何根资源类。 [java] at com.sun.jersey.server.impl.application.RootResourceUriRules。(RootResourceUriRules.java:103) [java] at com.sun.jersey.server.impl.application.WebApplicationImpl._initiate(WebApplicationImpl.java :1182) [java] at com.sun.jersey.server.impl.application.WebApplicationImpl.access $ 600(WebApplicationImpl.java:161) [java] at com.sun.jersey.server.impl.application.WebApplicationImpl $ 12 .f(WebApplicationImpl.java:698) [java] at com.sun.jersey.server.impl.application.WebApplicationImpl $ 12.f(WebApplicationImpl.java:695) [java] at com.sun.jersey.spi。 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。 sun.jersey.spi.container.servlet.ServletContainer.initiate(ServletContainer.java:438) [java] at com.sun.jersey.spi.container.servlet.ServletContainer $ InternalWebComponent.initiate(ServletContainer.java:287) [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) [java] at com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:342) [java] at com.sun.jersey.spi.container.servlet.ServletContainer.init (ServletContainer.jav在javax.servlet.GenericServlet.init(GenericServlet.java:211) [java] at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:431) [java]在org.eclipse.jetty.servlet.ServletHolder.getServlet(ServletHolder.java:330) 【JAVA]在org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:510)

+0

嗨jspyeatt! 我已经使用ServletHolder代码部分以编程方式在Android上使用Jetty嵌入式Web服务器创建Jersey Servlet。 不幸的是我得到的例外: com.sun.jersey.api.container.ContainerException:没有WebApplication提供者 你有什么想法如何解决这个问题吗?谢谢! – Giorgio 2012-06-25 12:51:12

回答

8

我相信我有追踪我遇到的问题。 问题是,默认情况下,proguard不包含混淆jar文件中的目录条目。

所以我混淆的jar文件内容看起来像这样。

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

注意,没有目录条目。

当我添加-keep目录指令到我的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 

完成后,Servlet能够遍历查找我的@Path注释资源的目录。

一个血腥的指令,痛苦的日子。