5

与 JDK6 捆绑的 JAX-WS 实现可用于提供 Web 服务服务器,而无需任何额外的库。JVM 将从指定端口上的 WS 服务器开始。

https://www.oracle.com/technical-resources/articles/javase/jax-ws-2.html

http://java.sun.com/developer/technicalArticles/J2SE/jax_ws_2_pt2/

我的问题是这与 Metro 项目有何不同?如果最终目标是在 tomcat 中托管 Web 服务,那么我是否仍然可以使用捆绑的功能,然后重定向到这个捆绑的 ws 服务器,还是部署 Metro servlet 更好?

4

2 回答 2

17

好吧,关于 Metro,您必须了解的第一件事是,它是各种 WS 相关项目的总括项目,即。JAX-WS、JAXB、WSIT、JAX-WS-Commons 等。

这些组件中的每一个都有两部分,API(规范)和称为参考实现(RI)的实现部分。规范在“javax.xml.ws”、“javax.xml.bind”等中定义,RI 位于“com.sun.xxx”包中。

现在在 JDK 6 的某个地方,更新 4,sun/oracle 开始将这些 API + RI 捆绑到它自己的 JDK 中,并通过对 JDK 的更新不断更新这些。

截至上一个 JDK 6 update31,JDK 包含以下版本的 JAXWS 和 JAXB API,以及 RI

JDK6 u31 - JAXB API @ 2.1 & RI @ 2.1.10、JAXWS API @ 2.1 和 RI @ 2.1.6

现在,如果您访问http://jaxb.java.nethttp://jax-ws.java.net页面,并查看 2.1.x 下的最新版本,您将看到 JAXB RI 位于 2.1.13 JAXWS RI 是 2.1.7,即与最新的 JDK 6 更新捆绑在一起的 2.1 spces 的 RI 实现比 Metro 下发布的版本落后几个版本。因此,要使用最新的 2.1 jar,只需将 API + RI jar 复制到您的类路径,如此处所述http://jax-ws.java.net/2.1.7/docs/ReleaseNotes.html#Running_on_top_of_JDK_6

更令人困惑的是,Metro 这个伞形项目有它自己的版本号,截至今天,1.5、2.0、2.0.1、2.1、2.1.1、2.2

Metro 1.5 是捆绑 2.1 spces 和该规范的最新 RI 的最后一个版本,即 Metro 1.5 包含 JAXWS 和 JAXB API @ 2.1 和 JAXWS RI @ 2.1.7 和 JAXB RI @ 2.1.13。

Metro 2.0 及更高版本捆绑了 JAXB 和 JAXWS API v2.2 以及截至发布数据的最新 RI。例如,最新的 METRO 版本 2.2 捆绑了 JAXB RI 2.2.5 和 JAXWS RI 2.2.6。

但是有一个问题,JDK 6 bundles v2.1 for JAXWS 和 JAXB (APIs + RI),如果你只是在你的类路径中使用 JAXWS , JAXB v2.2 jars 它将不起作用。您必须使用经认可的 jar 机制,如此处所述http://jax-ws.java.net/2.2.3/docs/ReleaseNotes.html#Running_on_top_of_JDK_6

因此,对于任何 Metro 2.0 及更高版本,您需要复制 $JAVA_HOME/jre/lib/endorsed 下的 jax-ws-api.jar 和 jaxb-api.jar 文件,或使用 -Djava.endorsed.dirs 系统财产。

更有趣的是,Metro 不是一个包含 jax-ws、jaxb 项目(以及其他)的伞式项目,但它也从这些项目中制作了一个 uber jar。

例如,metro 的 webservices-api.jar 包含 jaxws-api.jar 、 jaxb-api.jar (RI) + 来自其他子项目(如 WSIT、jax-ws-commons 等)的 API。

webservices-rt.jar 包含 jaxws-rt.jar、jaxb-rt.jar 和其他子项目(如 WSIT、jax-ws-commons 等)的 RT jars。

所以总结一下——

如果您想根据 JAXWS/JAXB v2.1 规范开发您的 WS,只需使用 JDK 6(超过 u04 的任何更新)。如果您想绝对确保使用 2.1 规范的最新 API + RI 版本,只需使用来自 jaxws 和 jaxb 的最新 2.1.x 版本 jar。即在您的类路径中使用 jax-ws 2.1.7 和 jaxb 2.1.13,[或者您可以使用 Metro 1.5 的 webservices-api.jar 和 webservices-rt.jar,因为它们捆绑了 jaxws/jaxb/wsit/。 . ]

如果你想根据最新的 JAXWS/JAXB v2.2 规范开发你的 WS,那么你必须使用 jax-ws v2.2.6 和 jaxb ver 2.2.5 jar [或者使用 Metro 2.2 的 webservices-api。 jar 和 webservices-rt.jar 因为它们捆绑了 jaxws/jaxb/wsit..] 但是您必须使用如上所述的认可 jar 机制,才能覆盖 jdk 包含的 jaxws/jaxb v2.1 jar。

我的建议 - 如果 v2.1 适合您,请使用 Metro 1.5 jar(webservices-api、webservices-rt)。如果您需要 v2.2,请使用 Metro 2.2 jar(webservices-api、webservices-rt),并确保将 webservices-api.jar 放在认可的目录中。

如果您要使用 fastinfosets、Mtom 等作为 JDK 捆绑 jar 或仅 jaxws-ri.jar 和 jaxb- ri.jar 不会为您提供这些功能。

希望这封相当长的邮件有助于清理一些事情。

于 2012-03-22T15:11:00.620 回答
1

据我所知,JAX-WS 只是一个模板,必须由 JDK6 或 Metro 实现来实现。

Metro 只是 Glassfish 应用服务器附带的标准实现。见这里

因此不应该有任何差异。

于 2012-03-08T21:56:44.860 回答