跟随《web services 教程》的章节,本来该研究JAX-RPC了,也基本看懂了JAX-RPC的代码,可还是在想要动手实验的时候碰壁了:我下载的WSDP2.0和教程的内容不配套,如果直接把提供的war文件塞Tomcat里部署报错,而手工编还缺少了一些工具。我也懒得再去找了,主要是看到了IBM上一篇比较JAX-RPC和JAX-WS的文章,还是换手JAX-WS吧,而且我下的jwstutorial2.0正好有JAX-WS的入门教程。
初次看JAX-WS的代码有种似曾相识的感觉,一想原来和之前看过的CXF(隐约感觉是基于JAX-WS或是有某种联系的)和JUnit4的代码类似,都是基于annotations的。开发 JAX-WS的流程和RPC的差不多:
1、编写服务的执行类代码
2、编译执行类的代码
3、使用wsgen工具生成部署服务所必须的artifacts
4、把所有相关文件打包成一个war文件
5、部署这个war文件。类文件tie(用来和客户端通信)会由Application Server在部署服务时自动生成
6、编写客户端代码
7、使用wsimport生成并编译stub文件
8、编译客户端代码
9、运行客户端
我没有先急着研究代码,而是决定先用example提供的代码部署一下试试。果然问题暴露了:使用ant编译时报错了!
郁闷怎末1.6的JDK竟然没包括2.1的JAX-WS,于是只能根据提示,找到common文件夹(jaxws文件夹里的)里的targets.xml文件,在里面的<wsgen>元素里加入属性:xendorsed="true"。再ant,终于sucessful了。将ant create-war生成的war文件部署到jee5的服务器里,正常!由于没有编译客户端,就直接用服务器调试服务,返回值正常!
P.S.:其实我最初尝试的是提示的第一个方案:用新的jar包替代jdk里的旧版本。可是Google上找了半天,各大英文的java社区都逛了,也没找到个真正能解决问题的方案。各大社区的基本思路是,在jre的lib文件夹下新建一个endorsed文件夹,把JAX-WS2.1的lib里的新版jar包放进去(我怕麻烦,都塞进去了也没用)即可。
P.S.2:后来上网查了资料发现JDK6的update4以后的版本都包含JAX-WS2.1了,可为什么我使用:wsgen -version查询到的版本还是2.0的呢?折腾了大白天才发现:没更新环境变量!重新指向以后发现果然已经是2.1版的了。可这时候使用:asant build还是提示版本为2.0,不知为什么了~但直接用wsgen -d build -s build -classpath helloservice.endpoint.Hello却是成功的,之后的asant create-war也可以成功。
P.S.3:找到为什么asant指认的版本有误了,因为它的属性文件是关联到JEE的SDK的,而JEE的SDK在安装时已经固定指向了旧版的JDK,所以改了环境变量asant出来的版本还是旧的。可改了SDK的指向后,更麻烦的问题冒出来了,asant本来能成功的命令都出错了:
P.S.4:找到了最终的解决办法!重新把JAVA_HOME指向我的jdk6U3,修改我的P.S.1里提到的endorsed文件夹,里面只能塞两个包:jaxb-api.jar和jaxws-api.jar。一切正常了,真爽!于是想起最近经常看到的一句话: web 服务的原理不难, 难就难在这个配置上了。