# JAX-WS WebService und Tomcat 7



## nebulo (25. Mrz 2011)

Hallo,

hat jemand von euch einen WebService (JAX-WS) unter Tomcat 7 laufen. Ich versuche meine zum Laufen zu bekommen, bekomme aber immer einen HTTP 404. 

Meine sun-jaxws.xml und web.xml sollten korrekt sein. In den Tomcat-Logs finde ich leider auch keine Hinweise. Hat mir jemand von euch ein Beispiel oder ein Link auf ein Howto?

Grüße nebulo


----------



## fax (25. Mrz 2011)

Habe nur Tomcat 5.x und 6.x probiert, aber das klingt mehr nach einem Konfigurationsproblem als einem Problem mit Tomcat. Hier gibt's Beispielapplikationen: JAX-WS RI 2.2.1 -- Samples


----------



## nebulo (25. Mrz 2011)

Hallo,

ich habe das Beispiel "jaxws-fromwsdl" per ant erstellt und danach das war per web-interface deployed. Ich erhalte aber auch hier immer ein HTTP 404. Egal ob ich  die URL http://localhost:8080/jaxws-fromwsdl?wsdl oder http://localhost:8080/jaxws-fromwsdl aufrufe.

Grüße nebulo


----------



## fax (25. Mrz 2011)

http://localhost:8080/jaxws-fromwsdl/addnumbers bzw. http://localhost:8080/jaxws-fromwsdl/addnumbers?wsdl


----------



## nebulo (25. Mrz 2011)

Vielen Dank! 

Man sollte Readmes halt vollständig lesen. Tatsächlich funktioniert auch mein eigener WebService nun.


----------



## fsicher (27. Apr 2011)

nebulo hat gesagt.:


> Vielen Dank!
> 
> Man sollte Readmes halt vollständig lesen. Tatsächlich funktioniert auch mein eigener WebService nun.



Ich habe das gleiche Problem: bringe ein JAX-WS mit Tomcat 7 nicht zum Laufen. Auch nach dem ich 

JAX-WS RI 2.2.1 -- Samples

gelesen habe (Instanlation, setzen der Umgebungsvariablen und 'ant-install').

Leider sind gewisse Seiten, auf die hier verwiesen wird, nicht mehr verfügbar. Welche "Readmes" meinst du? Bzw. was hast du gemacht, damit es am Schluss doch geht? Kannst du mir einen Tipp oder Link geben?

Danke.


----------



## fax (27. Apr 2011)

fsicher hat gesagt.:


> Ich habe das gleiche Problem: bringe ein JAX-WS mit Tomcat 7 nicht zum Laufen.


Erzähl doch mal genauer, was nicht funktioniert.



fsicher hat gesagt.:


> Leider sind gewisse Seiten, auf die hier verwiesen wird, nicht mehr verfügbar.


Hast du die URLs parat? Die sind vermutlich nur umgezogen.


----------



## fsicher (27. Apr 2011)

Die URLs aus Beiträgen 3 & 4 werden mit "Seitenladefehler" quittiert!

Was nicht funktioniert:
- habe JDK 1.6 (1.6.0_24) und Tomcat 7
- habe jax-ws installiert
- CATALINA_HOME und JAXWS_HOME gesetzt (wie unter JAX-WS RI 2.2.1 -- Release Notes beschrieben)

Der Versuch _ant install-api_ auszuführen, scheiterte (Zugriff verwiegert, ...): die zwei jar-Dateien habe ich anschliessend von Hand in *<JAVA_HOME>\jre\lib\endorsed* kopiert. Mit _ant install_ wurde im *<CATALINA_HOME>\shared\lib* angelegt und die entsprechenden jar-Dateien kopiert.

Bevor ich mein Service installiere, kontrolliere ich, ob Tomcat noch startet: NEGATIV! Erst wenn ich das Verzeichnis *<CATALINA_HOME>\shared\lib\*.jar* entferne, kann ich Tomcat wieder starten. 

Also, die erste Frage: Braucht es die jar-Dateien im *<CATALINA_HOME>\shared\lib* bei Tomcat 7 überhaupt? 

Die zweite Frage wäre: 
Wenn ich mein Service habe (von Hand verpackt), muss ich noch irgendewelche zusätzlichen Konfigurations-Dateien auch mitgeben? Oder, reicht es, wenn ich im *WEB-INF* Verzeichnis das Verzeichnis *classes *anlege und die class-Dateien dort ablege?

Velen Dank.

---------------------------------------------------------------------------------

Hier ein Beispiel:

Schnittstelle "Adder":

```
package ws.demo.model;

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

@WebService
public interface Adder {

	@WebMethod
	double add(@WebParam(name = "a") double a, @WebParam(name = "b") double b);
}
```

Implementierende Klasse:

```
package ws.demo.busines;

import javax.jws.WebService;

import ws.demo.model.Adder;

@WebService(endpointInterface = "ws.demo.model.Adder", serviceName = "AdderService")
public class AdderImpl implements Adder {

	@Override
	public double add(double a, double b) {
		return a + b;
	}
}
```

Server-Klasse (zum Testen aus *eclipse*):

```
package ws.demo.server;

import javax.swing.JOptionPane;
import javax.xml.ws.Endpoint;

import ws.demo.busines.AdderImpl;
import ws.demo.model.Adder;

public class Server {

	public static void main(String[] args) {
		Adder adder = new AdderImpl();
		Endpoint endpoint = Endpoint.publish("http://localhost:8080/adder",
				adder);

		JOptionPane.showMessageDialog(null, "Service beenden!");
		endpoint.stop();
	}
}
```

Es funktioniert: http://localhost:8080/adder?wsdl zeigt die WSDL an.

Um die adder.war-Datei zu kreieren, wird folgende Struktur angelegt:

*WEB-INF\classes\*.class* Dateien in zugehörigen Paketen (Inhalt des bin-Verzeichnises aus eclipse)

Weiter werden die Dateien _web.xml_ und_ sun-jaxws.xml_ im *WEB-INF* abgelegt. 

Die web.xml ist wie folgt:
[XML]<?xml version="1.0" encoding="UTF-8"?>

<web-app version="2.4" xmlns="http://ws.demo.adder">

	<display-name>Adder-WebService</display-name>
	<description>Ein einfacher Adder-WebService</description>

 	<listener>
    		<listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>

  	</listener>

  	<servlet>
    		<servlet-name>AdderServlet</servlet-name>
    		<display-name>Adder</display-name>
    		<description>Servlet Beschreibung</description>

   		 <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
    		<load-on-startup>1</load-on-startup>
  	</servlet>

  	<servlet-mapping>
    		<servlet-name>AdderServlet</servlet-name>
    		<url-pattern>/adder</url-pattern>
  	</servlet-mapping>

  	<session-config>
    		<session-timeout>180</session-timeout>
  	</session-config>

</web-app>[/XML]

Die sun-jaxws.xml ist wie folgt:
[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="ws.demo.model.Adder"
        implementation="ws.demo.busines.AdderImpl" 
        url-pattern="/adder">
</endpoints>[/XML]

Generieren:
*jar cvf adder.war WEB-INF*

*war*-Datei erstellt!

Tomcat 7 wird gestartet, alles O.K. Vorhandene Web-Services (mit CXF bzw. Axis2) können angespreochen werden. Die Datei *adder.war *wird in *webapps *abgelegt ...

Beim Dekomprimieren der war-Datei kommt folgende Meldung:
[XML]
INFO: Undeploying context [/adder]
27.04.2011 23:28:43 org.apache.catalina.startup.HostConfig deployWAR
INFO: Deploying web application archive adder.war
27.04.2011 23:28:43 org.apache.catalina.core.StandardContext startInternal
SCHWERWIEGEND: Error listenerStart
27.04.2011 23:28:43 org.apache.catalina.core.StandardContext startInternal
SCHWERWIEGEND: Context [/adder] startup failed due to previous errors
[/XML]

Woran liegt es? Sind meine XML-Dateien nicht korrekt?

Vielen Dank.


----------



## fax (27. Apr 2011)

fsicher hat gesagt.:


> Der Versuch _ant install-api_ auszuführen, scheiterte (Zugriff verwiegert, ...): die zwei jar-Dateien habe ich anschliessend von Hand in *<JAVA_HOME>\jre\lib\endorsed* kopiert.


Brauchst du nicht, das ist nur interessant, wenn man JAX-WS Code außerhalb Tomcat ausführen will.



fsicher hat gesagt.:


> Bevor ich mein Service installiere, kontrolliere ich, ob Tomcat noch startet: NEGATIV! Erst wenn ich das Verzeichnis *<CATALINA_HOME>\shared\lib\*.jar* entferne, kann ich Tomcat wieder starten.


Was sagt catalina.log, wenn es nicht startet?



fsicher hat gesagt.:


> Also, die erste Frage: Braucht es die jar-Dateien im *<CATALINA_HOME>\shared\lib* bei Tomcat 7 überhaupt?


Theoretisch kannst du die JAX-WS Dateien einfach in deine Web App packen. Leider ist in JDK 6 JAX-WS 2.1 eingebaut und das kommt sich mit JAX-WS 2.2 in die Haare. Kann gut sein, dass diese Tomcat shared/lib mal wieder woanders hingeschoben wurde, jedenfalls hat sich das Verzeichnis bisher noch mit jeder größeren Versionsänderung von Tomcat geändert.



fsicher hat gesagt.:


> Wenn ich mein Service habe (von Hand verpackt), muss ich noch irgendewelche zusätzlichen Konfigurations-Dateien auch mitgeben? Oder, reicht es, wenn ich im *WEB-INF* Verzeichnis das Verzeichnis *classes *anlege und die class-Dateien dort ablege?


Ich bin mir gerade nicht sicher, ob Tomcat die JAX-WS Annotationen genügen, oder ob man zusätzlich noch ein JAX-WS Servlet konfigurieren muss. Steht im JAX-WS User Guide.


----------



## fsicher (28. Apr 2011)

Habe noch einmal mit ant install-api versucht um Logdeinträge zu bekommen. Die Logdatei enthält knapp 3000 Zeilen. Ich zeige nur einen kurzen Auszug: vielleicht sagt das jemandem etwas. 


```
INFO: Starting Servlet Engine: Apache Tomcat/7.0.12
28.04.2011 00:03:21 org.apache.catalina.loader.WebappClassLoader validateJarFile
28.04.2011 00:03:36 org.apache.catalina.startup.ContextConfig checkHandlesTypes
WARNUNG: Unable to load class [com.sun.codemodel.JArrayClass$1] to check against the @HandlesTypes annotation of one or more ServletContentInitializers. 
java.lang.ClassNotFoundException: com.sun.codemodel.JArrayClass$1
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1676)
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1521)
	at org.apache.catalina.startup.ContextConfig.checkHandlesTypes(ContextConfig.java:1956)
	at org.apache.catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.java:1919)
	at org.apache.catalina.startup.ContextConfig.processAnnotationsJar(ContextConfig.java:1806)
	at org.apache.catalina.startup.ContextConfig.processAnnotationsUrl(ContextConfig.java:1765)
	at org.apache.catalina.startup.ContextConfig.processAnnotations(ContextConfig.java:1751)
	at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1255)
	at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:882)
	at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:317)
	at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
	at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:89)
	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5081)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
	at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1033)
	at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:774)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
	at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1033)
	at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:291)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
	at org.apache.catalina.core.StandardService.startInternal(StandardService.java:443)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
	at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:727)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
	at org.apache.catalina.startup.Catalina.start(Catalina.java:620)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:303)
	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:431)
28.04.2011 00:03:36 org.apache.catalina.startup.ContextConfig checkHandlesTypes
WARNUNG: Unable to load class [com.sun.codemodel.JCodeModel$1] to check against the @HandlesTypes annotation of one or more ServletContentInitializers. 
java.lang.ClassNotFoundException: com.sun.codemodel.JCodeModel$1
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1676)
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1521)
	at org.apache.catalina.startup.ContextConfig.checkHandlesTypes(ContextConfig.java:1956)
	at org.apache.catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.java:1919)
	at org.apache.catalina.startup.ContextConfig.processAnnotationsJar(ContextConfig.java:1806)
	at org.apache.catalina.startup.ContextConfig.processAnnotationsUrl(ContextConfig.java:1765)
	at org.apache.catalina.startup.ContextConfig.processAnnotations(ContextConfig.java:1751)
	at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1255)
	at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:882)
	at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:317)
	at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
	at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:89)
	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5081)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
	at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1033)
	at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:774)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
	at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1033)
	at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:291)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
	at org.apache.catalina.core.StandardService.startInternal(StandardService.java:443)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
	at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:727)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
	at org.apache.catalina.startup.Catalina.start(Catalina.java:620)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:303)
	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:431)
28.04.2011 00:03:36 org.apache.catalina.startup.ContextConfig checkHandlesTypes
WARNUNG: Unable to load class [com.sun.codemodel.JExpr$3] to check against the @HandlesTypes annotation of one or more ServletContentInitializers. 
java.lang.ClassNotFoundException: com.sun.codemodel.JExpr$3
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1676)
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1521)
	at org.apache.catalina.startup.ContextConfig.checkHandlesTypes(ContextConfig.java:1956)
	at org.apache.catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.java:1919)
	at org.apache.catalina.startup.ContextConfig.processAnnotationsJar(ContextConfig.java:1806)
	at org.apache.catalina.startup.ContextConfig.processAnnotationsUrl(ContextConfig.java:1765)
	at org.apache.catalina.startup.ContextConfig.processAnnotations(ContextConfig.java:1751)
	at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1255)
	at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:882)
	at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:317)
	at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
	at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:89)
	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5081)

...

java.lang.ClassNotFoundException: com.sun.tools.xjc.grammar.xducer.NilTransducer
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1676)
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1521)
	at org.apache.catalina.startup.ContextConfig.checkHandlesTypes(ContextConfig.java:1956)
	at org.apache.catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.java:1919)
	at org.apache.catalina.startup.ContextConfig.processAnnotationsJar(ContextConfig.java:1806)
	at org.apache.catalina.startup.ContextConfig.processAnnotationsUrl(ContextConfig.java:1765)
	at org.apache.catalina.startup.ContextConfig.processAnnotations(ContextConfig.java:1751)
	at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1255)
	at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:882)
	at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:317)
	
...

java.lang.ClassNotFoundException: com.sun.tools.xjc.grammar.xducer.QNameTransducer
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1676)
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1521)
	at org.apache.catalina.startup.ContextConfig.checkHandlesTypes(ContextConfig.java:1956)
	at org.apache.catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.java:1919)
	at org.apache.catalina.startup.ContextConfig.processAnnotationsJar(ContextConfig.java:1806)
	at org.apache.catalina.startup.ContextConfig.processAnnotationsUrl(ContextConfig.java:1765)
	at org.apache.catalina.startup.ContextConfig.processAnnotations(ContextConfig.java:1751)
	at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1255)
	at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:882)

...
```


----------



## fax (28. Apr 2011)

Wenn ich mir so die Doku anschaue, scheint die JAX-WS Installation nur mit Tomcat 5 getestet zu sein. Mit Tomcat 6 haben sich die Verzeichnisse geändert und vermutlich benutzt Tomcat 7 die gleichen Verzeichnisse wie Tomcat 6. Probier doch mal, Metro zu installieren, das ist JAX-WS + diverse WS-* Spezifikationen und die Installation ist mit Tomcat 6 getestet:
Metro - Java.net

Aber schmeiß zuerst die alte JAX-WS Installation raus.


----------



## fsicher (28. Apr 2011)

Nach langem hin und her habe ich es auch gemacht. Besten Dank für deine Hilfe.

Ein URL für jene, die mit ähnlichen Problemen zu kämpfen haben ...

Deploy JAX-WS web services on Tomcat


----------

