# JAX WS und Tomcat 7



## fsicher (3. Jan 2012)

Hallo allerseits

Ich habe meine WebService-Anwendung implementiert, einen einfachen Client erstellt und die Anwendung direkt aus _eclipse_ getestet, ohne sie auf einen Server zu deployen:


```
// WebService publizieren
Endpoint ePoint = Endpoint.publish(uri, service);
```

Da alles korrekt lief, wollte ich die Anwendung auf Tomcat 7 deployen:

- Tomcat 7.0.23
- JDK / JRE 1.7
- metro 2.1.1 (&mdash; Java.net)

Tomcat wurde neu installiert und die Installation der JAX WS RI nach Anweisungen, die auf der metro-Seite zu finden sind, durchgeführt: 



> ant -Dtomcat.home=<TOMCAT_INSTALL_DIR> -f <METRO_INSTALL_DIR>/metro-on-tomcat.xml install



Das Verzeichnis _endorsed_ wurde erstellt und die _webservices-api.jar_ kopiert, das Verzeichnis _shared/lib_ wurde auch angelegt und die entsprechenden jar-Dateien (4 an der Zahl) kopiert,  die _catalina.properties_ (shared.loader) ergänzt. Alles wie erwartet. Als ich aber aus eclipse den Server starten wollte, ging es nicht. Er hat diverse Fehler gemeldet. 

Ich habe danach meine Umgebung kontrolliert / bereinigt, um sicher zu sein, dass ich nur JDK 1.7 habe und auch keine alte PATH-Einträge irgendwo versteckt sind. Leider hat das nicht geholfen. Teilweise hat Tomcat unverständliche Meldungen gebracht, biespielsweise, dass er die Klasse _ServletContextAttributeListener.class_ nicht findet (ClassNotFoundException), obwohl die Klasse in der _servlet-api.jar_ im _lib_-Verzeichnis enthalten war. Eine weitere Meldung war die folgende:



> ...
> Information: Initialization processed in 1793 ms
> Jan 03, 2012 12:26:31 AM org.apache.catalina.core.StandardService startInternal
> Information: Starting service Catalina
> ...



Um sicher zu sein, dass es nicht an meinem Projekt lag, habe ich ein einfaches "HelloWorld" Projekt erstellt (an sich übernommen von Creating a Simple Web Service and Client with JAX-WS) und auf Tomcat deployed. Aber, auch das ging nicht. 


```
package soap.ws.demo;

import javax.jws.WebMethod;
import javax.jws.WebService;

@WebService()
public class HelloWorld {

	private String message = new String("Hello, ");

	public HelloWorld() {

	}

	@WebMethod()
	public String sayHello(String name) {
		return message + name + ".";
	}
}
```

Die gleiche Meldung kam wieder, das Projekt konte nicht deployed werden. 



> ...
> *java.lang.NoClassDefFoundError: com/sun/xml/bind/api/JAXBRIContext*
> at com.sun.xml.ws.model.RuntimeModeler.buildRuntimeModel(RuntimeModeler.java:203)
> at com.sun.xml.ws.server.EndpointFactory.createSEIModel(EndpointFactory.java:343)
> ...



Hat jemand sonst ähnliche Probleme mit Tomcat 7 und JDK 1.7? Oder, gibt es evtl. Inkompatibilitäten zwischen JAX WS RI und Tomcat 7 oder was auch immer?

Bin für jeden Tipp dankbar.


----------



## fsicher (3. Jan 2012)

Leider habe ich noch etwas vergessen:

Die web.xml Datei:

[XML]
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>HelloWorldSoapWS</display-name>

	<listener>
		<listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>
	</listener>
	<servlet>
		<servlet-name>HWServlet</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>HWServlet</servlet-name>
		<url-pattern>/*</url-pattern>
	</servlet-mapping>

	<session-config>
		<session-timeout>60</session-timeout>
	</session-config>

</web-app>
[/XML]

Und die sun-jaxws.xml:
[XML]
<?xml version="1.0" encoding="UTF-8"?>
<endpoints xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime"
	version="2.0">
	<endpoint name="soap_ws_hw" implementation="soap.ws.demo.HelloWorld"
		url-pattern="/*" />
</endpoints>
[/XML]

Das Problem hängt (aus meiner Sicht) mit dem Listener-Servlet zusammen. Möglicherweise sind miene xml-Dateien nicht korrekt ...


----------



## DerFeivel (3. Jan 2012)

Kannst du mal bitte sämtliche Jar-Dateien, die in deinem Tomcat hinterlegt sind, hier auflisten?


Mich würds nicht wundern, wenn keine der Jar's die gesuchten Klassen enthält (kannst dir wahlweise auch 7-Zip installieren und selbst in die Jars gucken).



Hatte ich dich - glaube ich - schonmal gefragt, aber: 

Bist du auf einen Tomcat 7 festgelegt? Was spricht ansonsten gegen einen Applikationsserver wie JBoss (6.1 oder 7.1...) oder Glassfish?
Dort sind derartige Abhängigkeiten bereits von Haus aus hinterlegt.


----------



## fsicher (3. Jan 2012)

Vielen Dank. 

Ich habe mit 7-zip die jar-Dateien untersucht und die kritische Klasse auch gefunden:

Die Klasse _com.sun.xml.bind.api.JAXBRIContext_ ist in der _webservices-rt.jar_ enthalten, die in <CATALINA_HOME>/shared/lib zu finden ist.

Hier die Auflistung der jar-Dateien:

*<CATALINA_HOME>/shared/lib*:

webservices-extra.jar
webservices-extra-api.jar
webservices-rt.jar
webservices-tools.jar

*<CATALINA_HOME>/endorsed:*

webservices-api.jar

*<CATALINA_HOME>/lib:*

annotations-api.jar
catalina.jar
catalina-ant.jar
catalina-ha.jar
catalina-tribes.jar
ecj-3.6.2.jar
el-api.jar
jasper.jar
jasper-el.jar
jaxws-rt.jar
jsp-api.jar
servlet-api.jar
tomcat-api.jar
tomcat-coyote.jar
tomcat-dbcp.jar
tomcat-i18n-es.jar
tomcat-i18n-fr.jar
tomcat-i18n-ja.jar
tomcat-util.jar

Der Eintrag in der _catalina.properties_:
*shared.loader=${catalina.home}/shared/lib/*.jar*

Was die Server-Wahl anbelangt, da ist Tomcat an sich die erste Wahl. Ich habe früher auch mit JBoss gearbeitet, GlassFish kenne ich aber nicht. Und wenn irgendwie möglich, würde ich bei Tomcat lieber bleiben, da ich schon länger mit Tomcat arbeite.


----------

