将铲子朝向JAX-WS

       跟随《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编译时报错了!

执行ant:
D:\jwstutorial20\examples\jaxws\helloservice>asant build
Buildfile: build.xml

javaee-home-test:

init:

prepare:
[echo] Creating the required directories....

compile-service:
[echo] Compiling the server-side source code....
[javac] Compiling 1 source file to D:\jwstutorial20\examples\jaxws\helloservice\build

BUILD FAILED
D:\jwstutorial20\examples\jaxws\common\targets.xml:99: You are running on JDK6 w
hich comes with JAX-WS 2.0 API, but this tool requires JAX-WS 2.1 API. Use the e
ndorsed standards override mechanism (http://java.sun.com/javase/6/docs/technote
s/guides/standards/), or set xendorsed="true" on <wsgen>.

Total time: 3 seconds
 

       郁闷怎末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本来能成功的命令都出错了:

执行asant build:
Buildfile: build.xml

BUILD FAILED
F:\jwstutorial20\examples\jaxws\simpleclient\build.xml:5: The following error oc
curred while executing this line:
F:\jwstutorial20\examples\jaxws\common\targets.xml:26: taskdef A class needed by
class com.sun.tools.ws.ant.WsImport cannot be found: org/apache/tools/ant/Dynam
icConfigurator

Total time: 1 second

 

 

P.S.4:找到了最终的解决办法!重新把JAVA_HOME指向我的jdk6U3,修改我的P.S.1里提到的endorsed文件夹,里面只能塞两个包:jaxb-api.jar和jaxws-api.jar。一切正常了,真爽!于是想起最近经常看到的一句话: web 服务的原理不难, 难就难在这个配置上了。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值