2011-01-13 9 views
3

この投稿の長さは申し訳ありません。私はその中の有用な情報をすべて得ようとしており、人々が持つ疑問を予期しています。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)

+0

こんにちはjspyeatt! 私は、ServletHolder部分のコードを使用して、Android上にJetty組み込みWebサーバーがあるJerseyサーブレットをプログラムで作成しました。 残念ながら例外が発生しています: com.sun.jersey.api.container.ContainerException:WebApplicationプロバイダが存在しません これを解決する方法はありますか?ありがとう! – Giorgio

答えて

8

で私は私が持っていると信じて私が持っていた問題を追跡しました。 問題は、proguardはデフォルトで、難読化されたjarファイルにディレクトリエントリを含めないことです。

私の難読化されたjarファイルの内容は、このようになりました。

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

注:ディレクトリエントリはありません。

-keepdirectoryディレクティブを私の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 

これが完了すると、サーブレットは@Path注釈付きリソースを探すディレクトリをトラバースすることができます。

1つの血まみい指示、痛みの日。

関連する問題