19 stycznia 2010

Uruchamiamy usługę JAX-WS na serwerze Tomcat

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>

3 komentarze:

Arkadiusz Wróbel pisze...

aby nie kompilować bibliotek do wara wystarczy w tomcacie utworzyć folder endorsed i tam wrzucić potrzebne biblioteki jax-ws. Niestety te co są w JDK nie mogą byc używane do wersji serwerowych.

Anonimowy pisze...

Dobrze napisany tutorial. Nic dodac nic ujac. Mma pytanie odnosnie wydajnosci. Interesowales sie moze, jak z szybkoscia dzialania ?

Pisalem niedawno o tuningu tomcata przy polaczeniach http i przymierzam sie do podjecia takiego samego tematu odnosnie WS.

Mariusz Lipiński pisze...

Nie testowałem wydajności w żaden sposób.