この投稿の長さは申し訳ありません。私はその中の有用な情報をすべて得ようとしており、人々が持つ疑問を予期しています。Proguard-obfuscated RESTサービスで動作するJersey JAX-RSリソースを取得できません
Jerseyで実装され、Jettyで実行されている一連のRESTful Webサービスがあります。 jarファイルの難読化されていないバージョンではすべてうまく動作します。しかし、私はProGuardので難読化するとき、私は私のパッケージの一部としてメッセージ
The ResourceConfig instance does not contain any root resource classes.
で500エラーを取得する私はちょうどので、私は接続と基本的なジャージーの設定をテストすることができ、非常に簡単なの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
:私は私のping URLをヒットしようとすると
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を実行しようとすると、この投稿の下部に表示されますが、ほとんどの厄介なラインがある表示されます
スタックトレース:
[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ファイルがそこにあることに注意してください。
@Path("/")
public class HQServerResource {
@GET
@Produces(MediaType.APPLICATION_XML)
@Path("/ping")
public PingResponse pingGet(@Context HttpServletRequest httpRequest) {
LOGGER.debug("pingGet()");
return getPingResponse(httpRequest);
}
}
今私が原因ProGuardのと私の不慣れに私の憶測の段階に入ります。
-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リソースクラスは次のようになります。
私の問題はProguardがクラスファイルの@Pathアノテーションをマッシュアップしているという意見です。しかし、私はproguard設定ファイルにディレクティブ(-keepattributes Annotation)を持っています。それゆえ、私は今失われています。
ガイダンスをいただければ幸いです。
スタックトレース:
[javaの] com.sun.jersey.api.container.ContainerException:ResourceConfigのインスタンスはどのルートリソースクラスが含まれていません。 com.sun.jersey.server.impl.application.RootResourceUriRules。(RootResourceUriRules.java:103)の[java] [java] com.sun.jersey.server.impl.application.WebApplicationImpl._initiate(WebApplicationImpl.java :1182) 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) com.sun.jersey.server.impl.application.WebApplicationImplでの[java] $ 12.f(WebApplicationImpl.java:695) [java] at 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] at com。 (ServletContainer.java:288) [java] 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] 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) [Java] javax.servlet.GenericServlet.init(GenericServlet.java:211) [java] at 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) [javaの](ServletHolder.java:510)
こんにちはjspyeatt! 私は、ServletHolder部分のコードを使用して、Android上にJetty組み込みWebサーバーがあるJerseyサーブレットをプログラムで作成しました。 残念ながら例外が発生しています: com.sun.jersey.api.container.ContainerException:WebApplicationプロバイダが存在しません これを解決する方法はありますか?ありがとう! – Giorgio