Tomcat 7のWARファイルとしてデプロイするJAX-WS Webサービスアプリケーションがあります。これは、WARファイル内に含めたMetroライブラリの最新バージョンを使用しており、正常に動作します。
展開パッケージを簡略化しようとしています。 Sun JDKにMetroのコピーが含まれていることを理解しています(たとえば this question および this one を参照してください)。 Glassfishサイトからダウンロードしたものを使用します。私は、TomcatとJDKに付属するMetroの実装だけで問題を解決できるのか、それともできないのかを理解しようとしています。
WARの内容は次のとおりです(クラスファイルは削除されます)。
META-INF/MANIFEST.MF
WEB-INF/classes/
WEB-INF/classes/com/[et cetera]
WEB-INF/ibm-web-ext.xml
WEB-INF/lib/
WEB-INF/lib/stax-api.jar
WEB-INF/lib/webservices-api.jar
WEB-INF/lib/webservices-extra-api.jar
WEB-INF/lib/webservices-extra.jar
WEB-INF/lib/webservices-rt.jar
WEB-INF/lib/webservices-tools.jar
WEB-INF/Sun-jaxws.xml
WEB-INF/web.xml
wsdl/
wsdl/MyService.wsdl
web.xml
次を含む:
<servlet>
<servlet-name>MyService</servlet-name>
<servlet-class>
com.Sun.xml.ws.transport.http.servlet.WSServlet
</servlet-class>
</servlet>
WARからwebservices- * jar(Metro jar)を削除すると、Webサービスがエラー「Wrapper cannot find servlet class com.Sun.xml.ws.transport.http.servlet.WSServlet or a classによる"。 Java 7 SEが付属しているjarファイルのどこにもそのクラスが見つからないため、これは驚くべきことではありません。
Java 7はMetroに付属していますが、このようなものを作成するためにMetroの別のコピーをダウンロードする必要がある場合、どういう意味ですか?JAX-WS Webを実行することは可能ですか? Javaに付属のjarファイルのみを使用してTomcat内でサービスを提供しますか
バンドルされたJAX-WSは、スタンドアロン内でJAX-WSサービスを提供するためにonlyを使用するように意図されているため、サーブレットコンテナーとの統合が不足していますJavaアプリケーション(WTF!?!?!?)。
もちろん、その統合を行うサーブレットの実装を考えることができるので、WARにMetroの別のコピーを含める必要はありません。ただし、外部の「フル」コピーを含めるだけの方が簡単です。WARが膨らみますが、パフォーマンスが大幅に低下することはありません。さらに、このようにして、使用するバージョンを制御でき、JREに含まれていたバージョンでスタックするのを回避できます。
とにかく、Sunは通常、外部のライブラリと衝突しないように、バンドルされたライブラリのパッケージ名を変更しました。したがって、サーブレットが存在する場合(存在しない場合)、おそらく呼び出されます。
com.Sun.xml。 内部。 ws.transport.http.servlet.WSServlet
同じようにいくつかの構成プロパティも変更したため、これは非常に面倒です(例:タイムアウトに関連するもの)。そのため、バンドルされたJAX-WSを使用する場合は、
com.Sun.xml。 internal。 ...スタイル設定プロパティ、
ただし、外部JAX-WSを使用する場合は、
com.Sun.xml ....スタイルの構成プロパティ。
ありがとうサン!!
では、Java 7はMetroに付属しているとはどういう意味ですか?
これは完全に正しいわけではありません。 JDK6 +にはJAX-WS RI(参照実装)が含まれており、Metroはそのスーパーセットです。つまり、Metro = JAX-WS RI + WSITです。
Javaに付属のjarファイルのみを使用して、Tomcat内でJAX-WS Webサービスを実行することは可能ですか?
これは素晴らしい質問です。答えは-いいえ、WSServlet
クラスはHttpServlet
を拡張し、WSServletContextListener
はServletContextAttributeListener
およびServletContextListener
インターフェースを実装するためです。これらのインターフェースとクラスはすべてJava EEの一部であり、Java SEではありません。したがって、JDK/JREには含まれていません。 Sun/OracleはJava SEとJava EEを混在させないことを決定しました。これは、これらのクラスが実際にJDKに付属するJAX-WS RIバージョンから削除されたことを意味します/ JRE。したがって、TomcatにはJAX-WSベースのWebサービスを使用するために、JAX-WSの依存関係をインストールする必要があります。Tomcatには付属していないためです(たとえば、Glassfishを選択すると、完全なMetroが見つかりますバンドルされており、追加でインストールする必要はありません)。そうしないと、 Endpoint#publish メカニズムで行き詰まります。
以下も参照してください。
それは古い質問ですが、誰かがまだ答えを探しているなら。 JDK 1.7では、jaxws jarを含める必要はありません(私は正確に1.7.0_45を使用しています)。これを使用 http://www.mkyong.com/webservices/jax-ws/deploy-jax-ws-web-services-on-Tomcat/ リンクを使用してサンプルWebサービスを作成し、ステップをスキップしました5そしてそれはすべて動作します。私はTomcatバージョン7.0.47をターゲットにしています。プロジェクト全体は、jaxws-rt jar(つまり、コンパイル)のデフォルトのスコープを持つMavenでビルドされています。