Can';无法让Jersey JAX-RS资源使用Proguard模糊化REST服务

Can';无法让Jersey JAX-RS资源使用Proguard模糊化REST服务,jersey,proguard,Jersey,Proguard,请原谅这篇文章的长度。我试图从中获取所有有用的信息,并预测人们可能会提出的问题 我有一系列RESTful web服务,它们已经用Jersey实现并在Jetty中运行。 jar文件的未模糊版本一切正常。但是当我使用Proguard进行模糊处理时,我收到一个500错误的消息 The ResourceConfig instance does not contain any root resource classes. 作为我软件包的一部分,我有一个非常简单的ping服务,这样我就可以测试连接性和基本

请原谅这篇文章的长度。我试图从中获取所有有用的信息,并预测人们可能会提出的问题

我有一系列RESTful web服务,它们已经用Jersey实现并在Jetty中运行。 jar文件的未模糊版本一切正常。但是当我使用Proguard进行模糊处理时,我收到一个500错误的消息

The ResourceConfig instance does not contain any root resource classes.
作为我软件包的一部分,我有一个非常简单的ping服务,这样我就可以测试连接性和基本的Jersey配置

我用jersey启动jetty的代码如下所示:

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, "/");
@Path("/")
public class HQServerResource {
    @GET
    @Produces(MediaType.APPLICATION_XML)
    @Path("/ping")
    public PingResponse pingGet(@Context HttpServletRequest httpRequest) {
        LOGGER.debug("pingGet()");
        return getPingResponse(httpRequest);
    }
}
当我尝试从浏览器点击ping 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
因此,我认为jetty的配置和运行是正确的。正如我所说,这个应用程序的未模糊版本运行良好

当我尝试ping时出现的堆栈跟踪显示在此帖子的底部,但最麻烦的一行是:

[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);
}
我的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, "/");
@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]位于com.sun.jersey.server.impl.application.RootResourceUriRules.(RootResourceUriRules.java:103) [java]位于com.sun.jersey.server.impl.application.WebApplicationImpl.\u initiate(WebApplicationImpl.java:1182) [java]位于com.sun.jersey.server.impl.application.WebApplicationImpl.access$600(WebApplicationImpl.java:161) [java]位于com.sun.jersey.server.impl.application.WebApplicationImpl$12.f(WebApplicationImpl.java:698) [java]位于com.sun.jersey.server.impl.application.WebApplicationImpl$12.f(WebApplicationImpl.java:695) [java]位于com.sun.jersey.spi.inject.Errors.processWithErrors(Errors.java:197) [java]位于com.sun.jersey.server.impl.application.WebApplicationImpl.initiate(WebApplicationImpl.java:695) [java]位于com.sun.jersey.server.impl.application.WebApplicationImpl.initiate(WebApplicationImpl.java:690) [java]位于com.sun.jersey.spi.container.servlet.ServletContainer.initiate(ServletContainer.java:438) [java]位于com.sun.jersey.spi.container.servlet.ServletContainer$InternalWebComponent.initiate(ServletContainer.java:287) [java]位于com.sun.jersey.spi.container.servlet.WebComponent.load(WebComponent.java:587) [java]位于com.sun.jersey.spi.container.servlet.WebComponent.init(WebComponent.java:213) [java]位于com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:342) [java]位于com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:516) [java]位于javax.servlet.GenericServlet.init(GenericServlet.java:211) [java]位于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)

我相信我已经找到了我遇到的问题。 问题是proguard在默认情况下不包括模糊化jar文件中的目录项

所以我的模糊jar文件内容看起来像这样

com/sw/pr/hq/HQServerResource.class
com/sw/pr/hq/a.class
com/sw/pr/hq/a.class
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
注意,没有目录条目

当我将-keepdirectories指令添加到proguard文件时,我的模糊jar文件如下所示

com/sw/pr/hq/HQServerResource.class
com/sw/pr/hq/a.class
com/sw/pr/hq/a.class
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注释的资源


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

嗨,杰斯皮亚特!我已经使用了您的ServletHolder部分代码,在Android上用Jetty嵌入式Web服务器以编程方式创建了Jersey Servlet。不幸的是,我遇到了一个例外:com.sun.jersey.api.container.ContainerException:没有WebApplication提供程序。您知道如何解决这个问题吗?谢谢