Netbeans 6.8 & JAX-WS 2.2 (Metro 2.0) Service & Weblogic 10.x Server deployment
Deploying JAX-WS web service created with Netbeans to Weblogic server is not easy…opposite it’s getting harder and harder with every new version of Netbeans. I believe the main problem is that Netbeans does not create all the artifacts needed by Weblogic server – there are at least two things missing:
- classes representing request and response web service messages
- WSDL and schemas
Another problem is that we need to override default implementation of JAX-WS that comes with Weblogic Server (if we want to use latest JAX-WS RI implementation – e.g. JAX-WS 2.2).
So, here is the tutorial based on these two posts http://forums.java.net/jive/thread.jspa?messageID=375626 and http://forums.sun.com/thread.jspa?threadID=5419678.
1. Create WebApplication Project:
- Choose BEA Weblogic Server as target server (with JAVA EE 5)
2. Create New WebService (e.g HelloWorld in package test)
- Add simple helloWorld method that returns String
3. Check web.xml – there should be listener and servlet for HelloWorld service:
<listener>
<listener-class>
com.sun.xml.ws.transport.http.servlet.WSServletContextListener
</listener-class>
</listener>
<servlet>
<servlet-name>HelloWorld</servlet-name>
<servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorld</servlet-name>
<url-pattern>/HelloWorld</url-pattern>
</servlet-mapping>
4. We have to modify the build.xml to include a "-pre-dist" target that invokes the wsgen Ant task:
<project name="JaxWsRI" default="default" basedir=".">
<description>Builds, tests, and runs the project JaxWsRI.</description>
<import file="nbproject/build-impl.xml"/>
<target name="-pre-dist">
<taskdef name="wsgen" classname="com.sun.tools.ws.ant.WsGen">
<classpath path="${javac.classpath}:${j2ee.platform.classpath}"/>
</taskdef>
<wsgen
debug="true"
keep="true"
destdir="build/web/WEB-INF/classes"
resourcedestdir="build/web/WEB-INF/classes"
xendorsed="true"
sei="test.HelloWorld">
<classpath>
<pathelement path="${javac.classpath}:${j2ee.platform.classpath}"/>
<pathelement location="${java.home}/../lib/tools.jar"/>
<pathelement location="build/web/WEB-INF/classes"/>
</classpath>
</wsgen>
</target>
5. We also need WSDL and XSD files for web service
- Create new folder named wsdl in WEB-INF folder
- Right click HelloWorld web service under WebServices and select generate and copy WSDL… (choose wsdl folder created in first step)
6. Under project libraries deselect option to deploy Metro libraries.
7. Create new JAVA EE Enterprise Application (Select BEA Weblogic Server and Java EE and deselect any checkboxes for creating modules)
8. Add WebApplication with HelloWorld WS as JavaEE Module
9. Configure project packaging (project properties à build à packaging)
- Add Metro 2.0 Library
- Change Metro 2.0 location in archive to /APP-INF/lib
10. Modify weblogic-application.xml:
<?xml version="1.0" encoding="UTF-8"?>
<weblogic-application xmlns="http://www.bea.com/ns/weblogic/90">
<application-param>
<param-name>webapp.encoding.default</param-name>
<param-value>UTF-8</param-value>
</application-param>
<prefer-application-packages>
<package-name>com.ctc.*</package-name>
<package-name>com.sun.xml.*</package-name>
<package-name>com.sun.istack.*</package-name>
<package-name>com.sun.msv.datatype.*</package-name>
<package-name>com.sun.msv.driver.*</package-name>
<package-name>com.sun.msv.grammar.*</package-name>
<package-name>com.sun.msv.reader.*</package-name>
<package-name>com.sun.msv.relaxns.*</package-name>
<package-name>com.sun.msv.scanner.*</package-name>
<package-name>com.sun.msv.util.*</package-name>
<package-name>com.sun.msv.verifier.*</package-name>
<package-name>com.sun.msv.writer.*</package-name>
<package-name>com.sun.org.apache.xml.internal.*</package-name>
<package-name>com.sun.wsit.*</package-name>
<package-name>javax.jws.*</package-name>
<package-name>javax.xml.bind.*</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>javax.xml.activation.*</package-name>
<package-name>javax.xml.annotation.*</package-name>
<package-name>javax.xml.mail.*</package-name>
<package-name>javax.xml.security.*</package-name>
<package-name>javax.xml.registry.*</package-name>
<package-name>javax.xml.rpc.*</package-name>
<package-name>javax.xml.crypto.*</package-name>
<package-name>javanet.staxutils.*</package-name>
<package-name>jp.gr.xml.*</package-name>
<package-name>org.codehaus.stax2.*</package-name>
<package-name>org.glassfish.gmbal.*</package-name>
<package-name>org.iso_relax.*</package-name>
<package-name>org.jcp.xml.dsig.*</package-name>
<package-name>org.jvnet.*</package-name>
<package-name>org.relaxng.*</package-name>
</prefer-application-packages>
</weblogic-application>
11. Add standard deployment descriptor (application.xml):
<application version="5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_5.xsd">
<display-name>JaxWSRiEA</display-name>
<module>
<web>
<web-uri>WebAlplication.war</web-uri>
<context-root>/WebAlplication</context-root>
</web>
</module>
</application>

