JBossモジュールは最悪で、JBoss 7でカスタムResteasy/JAX-RSを使用できません

5145 ワード

JBoss EAP 6.1/AS 7.2.0はモジュール化されており、Webアプリケーションに表示されるモジュールを排除できるため、内蔵されたJAX-RSインプリメンテーション(Rest Easy 2.3.6)を簡単に無視して使用することができます.カスタム(3.0.6).しかし、悲しいことに、事実はそうではない.サーバ上で実行されている他のWebアプリケーションがアップグレードによって中断されないことを前提として、Rest Easyをグローバルにアップグレードするための公式ガイドラインの推奨事項を遵守する必要があります.
これは、組み込まれたRest Easyを排除し、webappに含まれるバージョンを使用するのに十分です.



   
       
           
       
   
 

しかし、それははるかに効果的ではありません.これは、ほとんどの作業を完了できます(一部の除外は不要かもしれませんが):



   
       
           
       
     
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
     
   
 

でも、近いだけ.問題はjavaxを排除することです.ws.rs.apiは無効です.コアJava EE APIは除外できないようです.死の道.
ちなみに、これは私が最後にjax-rsに関連した依存項目です.
// resteasyVersion = '3.0.6.Final'
compile group: 'org.jboss.resteasy', name: 'jaxrs-api', version: resteasyVersion
compile group: 'org.jboss.resteasy', name: 'resteasy-jaxrs', version: resteasyVersion
compile group: 'org.jboss.resteasy', name: 'resteasy-jackson2-provider', version: resteasyVersion // JSONP
compile group: 'org.jboss.resteasy', name: 'async-http-servlet-3.0', version: resteasyVersion // Required at runtime
compile group: 'org.jboss.resteasy', name: 'resteasy-servlet-initializer', version: resteasyVersion // Required at runtime

失敗した試みの大まかな歴史
私が経験したすべての路地を覚えていませんが、ここでは配置や実行中に遭遇した異常の概要です.
java.lang.ClassNotFoundException: org.jboss.resteasy.plugins.server.servlet.HttpServlet30Dispatcher

-org.jboss.resteasy:async-http-servlet-3.0:3.0.6.Finalを依存項目に対してorg.jboss.resteasy:async-http-servlet-3.0:3.0.6.Finalを行う
java.lang.ClassCastException: myapp.rs.RestApplication cannot be cast to javax.servlet.Servlet

-org.jboss.resteasy:resteasy-servlet-initializer:3.0.6.Finalを依存項目に対してorg.jboss.resteasy:resteasy-servlet-initializer:3.0.6.Finalを行う
java.lang.NoSuchMethodError: org.jboss.resteasy.spi.ResteasyProviderFactory.(Lorg/jboss/resteasy/spi/ResteasyProviderFactory;)V

-追加のRestEasy/Jacksonモジュールを除外リストに追加することで修正可能
java.lang.NoSuchMethodError: org.jboss.resteasy.specimpl.BuiltResponse.getHeaders()Ljavax/ws/rs/core/MultivaluedMap;

-これは解決できない最終的な問題です.問題は、BuiltResponseresteasy-jaxrsからjavax.ws.rs.core.Responseを継承するバージョンがこのクラスJAXRS-API 3.0.6からである.Final.JArは、Response方法が欠けており、上記のように排除できないJAX−RS 1.1 javax.ws.rs.apiモジュール(/jboss-eap-6.1.0/modules/system/layers/base/javax/ws/rs/api/main/jboss-jaxrs-api_1.1_spec-1.0.1.Final-redhat-2.jar)からのgetHeadersの無視に有利である.(allprogがこの衝突を暗示してくれたことに感謝します!)
結論
新しいJAX-RSを使用する唯一の方法は、JBossモジュールをアップグレードすることです.それが他のWebアプリケーションを破壊する場合は、苦境に陥ります.
経験と教訓:大量の既成の、集積の良好な機能(?)を持っていますのアプリケーションサーバは魅力的なようですが、競合するライブラリやクラスのロードの問題に遭遇すると、その価値はSwiftに低下します.長期的に見ると、Jettttyのような簡単なものから始めると、より良い解決策かもしれません.また、同じサーバ上で複数のWebアプリケーションを実行するのは2000年には賢いかもしれませんが、今では試してみる価値はありません.十分なディスク容量とメモリを備えているため、ライブラリの再利用は重要ではなく、すべてのアプリケーションのグローバル設定を1つの場所で管理できるのは当然のことです.マイクロサービスFTW!
参考:JBossモジュールが腐っており、The Holy Javaブログでは、JCGパートナーのJakub HolyのJBoss 7下のCustom Resteasy/JAX-RSは使用できません.
翻訳:https://www.javacodegeeks.com/2014/02/jboss-modules-suck-its-impossible-to-use-custom-resteasyjax-rs-under-jboss-7.html