好吧,关于 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.net和http://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 不会为您提供这些功能。
希望这封相当长的邮件有助于清理一些事情。