gpt4 book ai didi

jersey - 无法让 Jersey JAX-RS 资源与 Proguard 混淆的 REST 服务一起使用

转载 作者:行者123 更新时间:2023-12-02 06:37:12 26 4
gpt4 key购买 nike

请原谅这篇文章的篇幅。我正在尝试获取其中所有有用的信息,并预测人们可能提出的问题。

我有一系列 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, "/");

当我尝试从浏览器访问 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

我的混淆器配置如下所示(为简洁起见,删除了注释)。请注意,当我执行 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 资源类如下所示:

@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)。因此我现在迷路了。

任何指导将不胜感激。

堆栈跟踪:

[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._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

注意,没有目录条目。

当我将 -keepdirectories 指令添加到我的 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 注释资源。

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

关于jersey - 无法让 Jersey JAX-RS 资源与 Proguard 混淆的 REST 服务一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4682224/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com