Getting JAX-WS client work on Weblogic 9.2 with ant
I've recently had lots of issues trying to deploy a JAX-WS web servcie client on Weblogic 9.2. It turns out there is no straightforward guide on how to achieve this, so I decided to put together this short wiki entry hoping it might be useful for others.

Firstly, Weblogic 9.2 does not support web servcies using JAX-WS in general. It comes with old versions of XML-related java libraries that are incompatible with the latest JAX-WS (similar issues occur with Axis2, only Axis1 seems to be working flawlessly with Weblogic 9.x but that's a very old and unsupported library).

So, in order to get it working, some hacking is required. This is how I did it (note that we're using ant in our legacy corporate project, you probably should be using maven which should eliminate 50% of those steps below):

1. Download the most recent JAX-WS distribution from https://jax-ws.dev.java.net/ (The exact version I got was JAXWS2.2-20091203.zip)

2. Place the JAX-WS jars with the dependencies in a separate folder like *lib/webservices*.

3. Create a patternset in ant to reference those jars:

    <patternset id="jaxws.classpath">
        <include name="webservices/jsr173_api.jar" />  
           <include name="webservices/jsr181-api.jar" />       
           <include name="webservices/jaxb-api.jar" />
           <include name="webservices/jaxb-impl.jar" />
            <include name="webservices/jaxb-xjc.jar" /> 
            <include name="webservices/jaxws-tools.jar" />
           <include name="webservices/jaxws-rt.jar" />       
            <include name="webservices/jaxws-api.jar" />
           <include name="webservices/policy.jar" />
           <include name="webservices/woodstox.jar" />   
           <include name="webservices/streambuffer.jar" />       
           <include name="webservices/stax-ex.jar" />
           <include name="webservices/saaj-api.jar" />
           <include name="webservices/saaj-impl.jar" />
           <include name="webservices/gmbal-api-only.jar" />   
        </patternset>

4. Include the patternset in your WAR-related goal. This could look something like:

    <copy todir="${wardir.lib}" includeEmptyDirs="false" flatten="true">
    <fileset dir="${libs}">
    <!--lots of libs here, related to your project -->
    <patternset refid="jaxws.classpath"/>
    </fileset>
    </copy>

(not the *flatten="true"* parameter - it's important as Weblogic 9.x is by default not smart enough to access jars located in a different lcoation than WEB-INF/lib inside your WAR file)

5. In case of clashes, Weblogic uses its own jars by default. We want it to use the JAX-WS jars from our application instead. This is achieved by preparing a *weblogic-application.xml* file and placing it in META-INF folder of the deplotyed EAR file. It should look like this:

    <?xml version="1.0"?>
    <weblogic-application xmlns="http://www.bea.com/ns/weblogic/90" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <prefer-application-packages>
     <package-name>javax.jws.*</package-name>
     <package-name>javax.xml.bind.*</package-name>
     <package-name>javax.xml.crypto.*</package-name>
     <package-name>javax.xml.registry.*</package-name>
     <package-name>javax.xml.rpc.*</package-name>
     <package-name>javax.xml.soap.*</package-name>
     <package-name>javax.xml.stream.*</package-name>
     <package-name>javax.xml.ws.*</package-name>
     <package-name>com.sun.xml.api.streaming.*</package-name>
    </prefer-application-packages>
    </weblogic-application>

6. Remember to place that *weblogic-application.xml* file in your EAR! The ant goal for that may look similar to:

    <target name="build-ear" depends="war, manifest">
        <delete dir="${dist}"/>
        <mkdir dir="${dist}"/>
    
        <jar destfile="${warfile}" basedir="${wardir}"/>
     
        <ear destfile="${earfile}" appxml="resources/${app.name}/application.xml">
            <fileset dir="${dist}" includes="${app.name}.war"/>
            <metainf dir="resources/META-INF"/>     
        </ear>
    </target>

7. Also you need to tell weblogic to prefer your WEB-INF classes to those in distribution. You do that by placing the following lines in your *WEB-INF/weblogic.xml* file:

    <container-descriptor>
       <prefer-web-inf-classes>true</prefer-web-inf-classes>
      </container-descriptor>

8. And that's it for the weblogic-related configuration. Now only set up your JAX-WS goal. The one below is going to simply generate the web service stubs and classes based on a locally deployed WSDL file and place them in a folder in your app:

    <target name="generate-jaxws-client">
      <taskdef name="wsimport" classname="com.sun.tools.ws.ant.WsImport"> 
       <classpath path="classpath.main"/>
      </taskdef>
      
      <wsimport 
           destdir="${src}"
         package="acme.somewhere.in.your.package.tree.webservices."
        keep="true" 
        wsdl="http://localhost:8088/mockWebService?WSDL">       
      </wsimport>
     </target> 

Remember about the keep="true" parameter. Without it, wsimport generates the classes and... deletes them, believe it or not!

For mocking a web service I suggest using SOAPUI, an open source project. Very easy to deploy, crucial for web servcies intergation testing.

9. We're almost there. The final thing is to write a Java class for testing the web service, try to run it as a standalone app first (or as part of your unit tests)

10. And then try to run the same code from withing Weblogic. It should work. It worked for me. After some 3 days of frustration.
And yes, I know I should've put 9 and 10 under a single bullet-point, but the title "10 steps to deploy a JAX-WS web service under Web logic 9.2 using ant" sounds just so much better.

Please, edit this post and improve it if you find something missing!
Getting JAX-WS client work on Weblogic 9.2 with ant
===

I've recently had lots of issues trying to deploy a JAX-WS web servcie client on Weblogic 9.2. It turns out there is no straightforward guide on how to achieve this, so I decided to put together this short wiki entry hoping it might be useful for others.

Firstly, Weblogic 9.2 does not support web servcies using JAX-WS in general. It comes with old versions of XML-related java libraries that are incompatible with the latest JAX-WS (similar issues occur with Axis2, only Axis1 seems to be working flawlessly with Weblogic 9.x but that's a very old and unsupported library).

So, in order to get it working, some hacking is required. This is how I did it (note that we're using ant in our legacy corporate project, you probably should be using maven which should eliminate 50% of those steps below):

1. Download the most recent JAX-WS distribution from https://jax-ws.dev.java.net/ (The exact version I got was JAXWS2.2-20091203.zip)

2. Place the JAX-WS jars with the dependencies in a separate folder like *lib/webservices*.

3. Create a patternset in ant to reference those jars:

    <patternset id="jaxws.classpath">
        <include name="webservices/jsr173_api.jar" />  
           <include name="webservices/jsr181-api.jar" />       
           <include name="webservices/jaxb-api.jar" />
           <include name="webservices/jaxb-impl.jar" />
            <include name="webservices/jaxb-xjc.jar" /> 
            <include name="webservices/jaxws-tools.jar" />
           <include name="webservices/jaxws-rt.jar" />       
            <include name="webservices/jaxws-api.jar" />
           <include name="webservices/policy.jar" />
           <include name="webservices/woodstox.jar" />   
           <include name="webservices/streambuffer.jar" />       
           <include name="webservices/stax-ex.jar" />
           <include name="webservices/saaj-api.jar" />
           <include name="webservices/saaj-impl.jar" />
           <include name="webservices/gmbal-api-only.jar" />   
        </patternset>

4. Include the patternset in your WAR-related goal. This could look something like:

    <copy todir="${wardir.lib}" includeEmptyDirs="false" flatten="true">
    <fileset dir="${libs}">
    <!--lots of libs here, related to your project -->
    <patternset refid="jaxws.classpath"/>
    </fileset>
    </copy>

(not the *flatten="true"* parameter - it's important as Weblogic 9.x is by default not smart enough to access jars located in a different lcoation than WEB-INF/lib inside your WAR file)

5. In case of clashes, Weblogic uses its own jars by default. We want it to use the JAX-WS jars from our application instead. This is achieved by preparing a *weblogic-application.xml* file and placing it in META-INF folder of the deplotyed EAR file. It should look like this:

    <?xml version="1.0"?>
    <weblogic-application xmlns="http://www.bea.com/ns/weblogic/90" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <prefer-application-packages>
     <package-name>javax.jws.*</package-name>
     <package-name>javax.xml.bind.*</package-name>
     <package-name>javax.xml.crypto.*</package-name>
     <package-name>javax.xml.registry.*</package-name>
     <package-name>javax.xml.rpc.*</package-name>
     <package-name>javax.xml.soap.*</package-name>
     <package-name>javax.xml.stream.*</package-name>
     <package-name>javax.xml.ws.*</package-name>
     <package-name>com.sun.xml.api.streaming.*</package-name>
    </prefer-application-packages>
    </weblogic-application>

6. Remember to place that *weblogic-application.xml* file in your EAR! The ant goal for that may look similar to:

    <target name="build-ear" depends="war, manifest">
        <delete dir="${dist}"/>
        <mkdir dir="${dist}"/>
    
        <jar destfile="${warfile}" basedir="${wardir}"/>
     
        <ear destfile="${earfile}" appxml="resources/${app.name}/application.xml">
            <fileset dir="${dist}" includes="${app.name}.war"/>
            <metainf dir="resources/META-INF"/>     
        </ear>
    </target>

7. Also you need to tell weblogic to prefer your WEB-INF classes to those in distribution. You do that by placing the following lines in your *WEB-INF/weblogic.xml* file:

    <container-descriptor>
       <prefer-web-inf-classes>true</prefer-web-inf-classes>
      </container-descriptor>

8. And that's it for the weblogic-related configuration. Now only set up your JAX-WS goal. The one below is going to simply generate the web service stubs and classes based on a locally deployed WSDL file and place them in a folder in your app:

    <target name="generate-jaxws-client">
      <taskdef name="wsimport" classname="com.sun.tools.ws.ant.WsImport"> 
       <classpath path="classpath.main"/>
      </taskdef>
      
      <wsimport 
           destdir="${src}"
         package="acme.somewhere.in.your.package.tree.webservices."
        keep="true" 
        wsdl="http://localhost:8088/mockWebService?WSDL">       
      </wsimport>
     </target> 

Remember about the keep="true" parameter. Without it, wsimport generates the classes and... deletes them, believe it or not!

For mocking a web service I suggest using SOAPUI, an open source project. Very easy to deploy, crucial for web servcies intergation testing.

9. We're almost there. The final thing is to write a Java class for testing the web service, try to run it as a standalone app first (or as part of your unit tests)

10. And then try to run the same code from withing Weblogic. It should work. It worked for me. After some 3 days of frustration.
And yes, I know I should've put 9 and 10 under a single bullet-point, but the title "10 steps to deploy a JAX-WS web service under Web logic 9.2 using ant" sounds just so much better.

Please, edit this post and improve it if you find something missing!