与JDK6捆绑在一起的JAX-WS实现可用于提供Web服务服务器,而无需任何其他库。 JVM将从指定端口上的WS服务器开始。
http://java.sun.com/developer/technicalArticles/J2SE/jax_ws_2/
http://java.sun.com/developer/technicalArticles/J2SE/jax_ws_2_pt2/
我的问题是,这与Metro项目有何不同?如果最终目标是在tomcat中托管Web服务,那么我是否仍然可以使用捆绑功能然后重定向到这个捆绑的ws服务器,还是更好地部署metro servlet?
答案 0 :(得分:16)
那么, 您必须了解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开始在JDK中自己捆绑这些API + RI,并通过更新JDK来不断更新这些API。
从最后一次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罐,只需将API + RI罐复制到类路径中,如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捆绑v2.1用于JAXWS和JAXB(API + 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项目(其他)的伞状项目,但它也会从这些项目中产生一个超级jar。
例如,metro的webservices-api.jar包含jaxws-api.jar,jaxb-api.jar(RI)+来自其他子项目的API,如WSIT,jax-ws-commons等。
webservices-rt.jar包含jaxws-rt.jar,jaxb-rt.jar,+其他子项目的RT jar,如WSIT,jax-ws-commons等。
总结一下 -
如果您想针对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。
我的建议 - 如果您使用Metro 1.5罐(webservices-api,webservices-rt),则v2.1没问题。 如果你需要v2.2使用Metro 2.2 jars(webservices-api,webservices-rt),并确保将webservices-api.jar放在背书目录中。
如果要使用像fastinfosets,Mtom等东西作为JDK捆绑的罐子,或者只是jaxws-ri.jar,你需要地铁罐(webservices- [api,rt] .jar)和jaxb-ri.jar不会给你这些功能。
希望这封相当长的邮件有助于清理一些事情。
答案 1 :(得分:1)
据我所知,JAX-WS只是一个模板,必须由JDK6或Metro实现实现。
Metro就是Glassfish Application Server附带的标准实现。 See here
因此不应有任何差异。