JAX-WS WebService und Tomcat 7

nebulo

Bekanntes Mitglied
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
 
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.
 
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":
Java:
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:
Java:
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):
Java:
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.
 
Zuletzt bearbeitet:
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.

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?

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.

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.
 
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.

Java:
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)

...
 
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.
 

Zurück
Oben