2016-11-15 6 views
1

私はあなたに短編小説を最初に伝えます。 Eclipseでjarファイル(Runnable Jarウィザードと "Package required libraries ..."を選択)を "Extract required libraries"の代わりにエクスポートすると、すべてのことが動作しますが、非常に遅くなってしまいます。私が抽出方法で私の瓶を作るなら、コードは最終的に起こります。私の最初のWebクライアントは「メディアタイプにMessageBodyWriterが見つかりませんでした...」(JSON)

org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyWriter not found for media type=application/json 

私はMavenを使用していません。私はまだそれを知らない。私はほとんどがEclipseの中でほとんど経験はありませんが、私はそこに着いています。私はGensonがJSONの作成に必要なものを私に与えるだろうと思っていました。

私はMessageBodyWriterのための私のjarファイルとgrepをリストする場合、私は長い話に取得するには

1220 Tue Nov 15 10:29:02 CST 2016 javax/ws/rs/ext/MessageBodyWriter.class    
    47 Tue Nov 15 10:29:02 CST 2016 META-INF/services/javax.ws.rs.ext.MessageBodyWriter 

を取得し、私は、Eclipseで単純なJavaプロジェクトを作成し、私のビルド・パスに外部のjarファイルを追加しました。 Eclipseは何かが不足していると不平を言うことはありません私のコードには未使用のこのことについての警告が1つか2つしかありません。輸出はどちらの方法でもうまく動作しますが問題はありません。執行のみが何らかの刺激を明らかにする。

私のリクエストクラスでは、すべてを正しく設定していると思います。これは想像できる最も単純なPOSTクライアントです。私は必要な空のコンストラクタ、正しい注釈を持っています。

@XmlRootElement 
@Produces(MediaType.APPLICATION_JSON) 

public class QQNotificationRequest { 

    @JsonProperty("id") 
    private int id; 
    @JsonProperty("subId") 
    private int subId; 
    @JsonProperty("type") 
    private int type; 
    @JsonProperty("scode") 
    private int scode; 
    @JsonProperty("datetime") 
    private String datetime; 
    ... 

これは

Response resp = m_webTarget.request(MediaType.APPLICATION_JSON).post(Entity.json(message)); 

「エクスポート」されていない瓶の中で何かがあるように、これらは私の外部のjarファイル

javax.ws.rs-api-2.0.1.jar 
aopalliance-repackaged-2.5.0-b05.jar 
hk2-api-2.5.0-b05.jar 
hk2-locator-2.5.0-b05.jar 
hk2-utils-2.5.0-b05.jar 
javassist-3.20.0-GA.jar 
javax.annotation-api-1.2.jar 
javax.inject-2.5.0-b05.jar 
javax.servlet-api-3.0.1.jar 
jaxb-api-2.2.7.jar 
jersey-guava-2.24.jar 
org.osgi.core-4.2.0.jar 
osgi-resource-locator-1.0.1.jar 
persistence-api-1.0.jar 
validation-api-1.1.0.Final.jar 
jersey-client.jar 
jersey-common.jar 
jersey-container-servlet.jar 
jersey-container-servlet-core.jar 
jersey-media-jaxb.jar 
jersey-server.jar 
jargs.jar 
genson-1.4.jar 
jt400.jar 
log4j-api-2.7.jar 
log4j-core-2.7.jar 

ある私が感じるに失敗した私の究極の呼び出しです正しくは、わかりません。ただ、Javaが大きなジャーの中の全てのジャーを爆発させる過程を経なければならないので、大きなジャーの内部にあるクラスでは実行を開始する必要があることが分かります。

すぐに失われましたが、一緒に繋がっています。私はどんな指針にも感謝します。

答えて

1

問題は、実行時に存在する必要がある各ジャーナルジャーのMETA-INF/servicesディレクトリにファイルがあることです。これらのファイルは、プロバイダクラスを自動的にロードおよび登録するために使用されます。

すべてのjarを別々にしてクラスパスに追加するだけで、すべてのファイルがそのまま残ります。しかし、単一のjarファイルを作成すると、それらのファイルは重複しています(すべて同じ名前)ので、同じ名前を持つ各ファイルのうちの1つだけが含まれます。したがって、Gensonのファイルはおそらく含まれていません。

Gensonをアプリケーションのプロバイダとして明示的に登録するだけで済みます。私は実際にGensonを使用しないので、これを行う正しい方法がわからない。しかし、すぐにthe codebaseを見て、それはGensonJsonConverterを登録する必要があるように見えます。

これは機能するかもしれませんが、含まれていないサービスファイルに関する主な問題は解決しません。登録されていない他の自動登録コンポーネントもあります。

私は実際にEclipseユーザーではないので、この問題を解決する方法がわかりません。 Mavenを使用している場合は、前述のhereのようにmaven-shade-pluginを使用します。このプラグインが行うことは、すべてのファイルコンテンツを1つのファイルに連結することです。これは問題を解決するだろう。

私はEclipseを使用するときに似たようなことをする方法がわからないので、これは本当に半分の答えだと思います。しかし、少なくともあなたは今問題を知っています。

FYI、this fileは、主に心配しているものです。他のJerseyジャーを見ると、同様のファイルがあることがわかります。これは私が言うときに私が話していることです、ただ一つが使用されるでしょう。 jailをビルドするときにその内容を1つのファイルに連結する方法を見つける必要があります

+0

@peekskilletは、これらのサービス宣言ファイルのうちの1つだけがエクスポートされるという問題を説明しています。 Gensonに関しては、手動で登録することもできます。ジャージーのdoc [here](http://owlike.github.io/genson/Documentation/Extensions/#jax-rs-jersey--cie)をチェックしてください。 – eugen

+0

私は@peekskilletの答えをまだ完全に理解していません.Gensonをクラスパスにドロップするだけで、自動的に幸福が引き起こされるというリンクがあります。 :-)私が実際に理解していないのは、jarファイルがjarファイルの束である場合、jarファイルが動作する理由です。もう少し耕していくつもりです。 –

+1

上記のコメントを入力してから2分以内に、抽出されたjarsメソッドを使用して作業するようになりました。私はBuild Path-> Configure Build Pathに行き、 "Order and Export"タブでgenson-1.4.jarをリストの一番上に移動し、プロジェクトをrunnable jarにエクスポートしてテストしました。ここまでは順調ですね。 –

関連する問題