Jakiś czas temu (już dosyć dawno) zmagałem się z uruchomieniem usługi sieciowej JAX-WS na serwerze Tomcat. Nie udało mi się wtedy... ale udało mi się dzisiaj. A udało mi się, bo wszystko co było trzeba (a o czym nie wiedziałem) zrobił za mnie nowy NetBeans w wersji 6.8.
Pobrałem zaimplementowany przez samego siebie - i opisany w artykule "
JAX-WS i Maven 2 w podejściu Contract First Development" - projekt implementacji usługi sieciowej z użyciem technologi JAX-WS i postanowiłem jeszcze raz zmierzyć się z problemem. Projekt po zaimportowaniu do Eclipsa nie chciał się kompilować, a że nie byłem w nastroju do walki tego rodzaju, sięgnąłem po NetBeans IDE. Projekt zaimportował się i zbudował bez problemu. Skonfigurowałem serwer Tomcat w wersji 6.0.20 i kliknąłem 'Run'. Zaskoczenie było ogromne - NetBeans odezwał się komunikatem:
Kliknięcie na guzik z napisem 'Yes' spowodowało utworzenie pliku 'sun-jaxws.xml' i dodanie co nieco do pliku 'web.xml'. Uruchomienie mimo wszystko zakończyło się błędem:
java.lang.ClassNotFoundException:
com.sun.xml.ws.transport.http.servlet.WSServletContextListener
Dziwne - Tomcat nie widzi klas JAX-WS. Co prawda Tomcat ich nie zawiera, ale powinny być w Java SE 6 SDK! W każdym razie póki co postanowiłem poradzić sobie z tym problemem w sposób prosty, a mianowicie dodać niezbędne JARy do WARa. W tym celu usunąłem linijkę '<scope>provided</scope>' z konfiguracji zależności od JAX-WS w projekcie 'math-ws':
<dependency>
<groupid>com.sun.xml.ws</groupid>
<artifactid>jaxws-rt</artifactid>
<version>2.1.3</version>
<scope>provided</scope>
</dependency>
Przebudowałem projekt i ponownie kliknąłem 'Run'. Sukces! W ten oto prosty sposób udało mi się z pomocą NetBeans IDE uruchomić usługę sieciową JAX-WS na serwerze Tomcat. Dla ciekawych podaje jeszcze zawartość wygenerowanych plików 'web.xml' i 'sun-jaxws.xml' (w tej właśnie kolejności):
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.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/web-app_2_5.xsd">
<listener>
<listener-class>
com.sun.xml.ws.transport.http.servlet.WSServletContextListener
</listener-class>
</listener>
<servlet>
<servlet-name>MathServiceBeanService</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>MathServiceBeanService</servlet-name>
<url-pattern>/MathServiceBeanService</url-pattern>
</servlet-mapping>
</web-app>
<?xml version="1.0" encoding="UTF-8"?>
<endpoints version="2.0" xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime">
<endpoint
implementation="pl.centric.jaxws.math.service.MathServiceBean"
name="MathServiceBeanService"
url-pattern="/MathServiceBeanService"/>
</endpoints>