JAX WS und Tomcat 7

fsicher

Bekanntes Mitglied
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:

Java:
// 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 (— 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
Jan 03, 2012 12:26:31 AM org.apache.catalina.core.StandardEngine startInternal
Information: Starting Servlet Engine: Apache Tomcat/7.0.12
Jan 03, 2012 12:26:34 AM com.sun.xml.ws.transport.http.servlet.WSServletContextListener parseAdaptersAndCreateDelegate
Schwerwiegend: WSSERVLET11: failed to parse runtime descriptor: java.lang.NoClassDefFoundError: com/sun/xml/bind/api/JAXBRIContext
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)
at com.sun.xml.ws.server.EndpointFactory.createEndpoint(EndpointFactory.java:205)
at com.sun.xml.ws.api.server.WSEndpoint.create(WSEndpoint.java:513)
at com.sun.xml.ws.transport.http.DeploymentDescriptorParser.parseAdapters(DeploymentDescriptorParser.java:257)
at com.sun.xml.ws.transport.http.DeploymentDescriptorParser.parse(DeploymentDescriptorParser.java:151)
at com.sun.xml.ws.transport.http.servlet.WSServletContextListener.parseAdaptersAndCreateDelegate(WSServletContextListener.java:131)
at com.sun.xml.ws.transport.http.servlet.WSServletContainerInitializer.onStartup(WSServletContainerInitializer.java:65)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5184)
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:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:303)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:431)
Caused by: java.lang.ClassNotFoundException: com.sun.xml.bind.api.JAXBRIContext
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
... 27 more

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.

Java:
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)
at com.sun.xml.ws.server.EndpointFactory.createEndpoint(EndpointFactory.java:205)
at com.sun.xml.ws.api.server.WSEndpoint.create(WSEndpoint.java:513)
...

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

Bekanntes Mitglied
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

Bekanntes Mitglied
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

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

Ähnliche Java Themen

Neue Themen


Oben