JDK6:何时使用捆绑的 JAX-WS 实现与 Project Metro
Posted
技术标签:
【中文标题】JDK6:何时使用捆绑的 JAX-WS 实现与 Project Metro【英文标题】:JDK6: when to use bundled JAX-WS implementation versus Project Metro 【发布时间】:2012-03-26 09:38:18 【问题描述】:与 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 更好?
【问题讨论】:
【参考方案1】:嗯, 关于 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,即 RI与最新的 JDK 6 更新捆绑在一起的 2.1 spces 的实现比 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 jars [或者使用 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 jars(webservices-api、webservices-rt),并确保将 webservices-api.jar 放在认可的目录中。
如果您要使用 fastinfosets、Mtom 等作为 JDK 捆绑 jar 或仅 jaxws-ri.jar,则需要 Metro jar (webservices-[api,rt].jar)而 jaxb-ri.jar 不会为您提供这些功能。
希望这封相当长的邮件有助于解决一些问题。
【讨论】:
在哪里可以找到与某个 JDK 捆绑的 JAXB 版本?【参考方案2】:据我所知,JAX-WS 只是一个模板,它必须由 JDK6 或 Metro 实现来实现。
Metro 只是 Glassfish 应用服务器附带的标准实现。 See here.
因此应该没有任何差异。
【讨论】:
这意味着唯一的区别在于 Web 服务的部署方式:JDK6 中的独立内置服务器,然后从 tomcat 重定向与项目 Metro 附带的 servlet。我认为使用独立服务器没有任何限制,是吗? 不,未部署但已调用。来自 JDK 或 Metro 实现。两者都是标准实现,应该可以正常工作。谷歌快速搜索显示,Metro 在 JDK 之上使用了“更新和增强”的 API。见here。干杯以上是关于JDK6:何时使用捆绑的 JAX-WS 实现与 Project Metro的主要内容,如果未能解决你的问题,请参考以下文章