What are the relative strengths and weaknesses between Sun Metro and Apache CXF for webservice development in Java. Is there another framework that I should be looking at as well?
I was in your position a few months back, and ended up looking closer at Metro.
The killer feature for me was the fact that Metro uses standard annotations to expose a given method as a web service and that all the glue code could be generated automatically at runtime. I.e. no extra steps to make when building and deploying and works in a standard servlet container (2.5 I believe) under Java 5 which is our current deployment platform.
This has worked very well for us.
The reason that I went for the standard annotations is the very simple that our applications tend to live literaly for decades after which some maintainance must be done. By coding to an interface instead of an implementation we may swap out the whole scaffolding underneath the code without changing the code implementing the web service. In ten years time (or more) any specific implementaiton may have withered and died, but other implementaitons may have risen since and be immediately pluggable.
Just see how many choices you have today for a servlet container... Thats the power of a good API!
Edit: Apparently the Java 6 runtime includes the Metro stack plus a minimal web server. In other words, the JRE alone may be the scaffolding replacement mentioned above :D
Both Metro and CXF are JAX-WS compliant web service stacks, and from a runtime perspective, there's very little pick between them.
However, CXF has vastly better documentation, and much more flexibility and additional functionality if you're willing to go beyond the JAX-WS specification. On the basis of documentation alone, I'd pick CXF over Metroevery time.
However, I would pick Spring WebServices over either Metro or CXF. It's not JAX-WS-compliant, but I don't consider that to be an issue. It's also both considerably simpler, and considerably more flexible than either of them. Highly recommended.