Ошибка исключения WSServlet ClassNotFoundException в Tomcat 7.0.11 с использованием Metro 2.1

#java #web-services #jax-ws #java-metro-framework #tomcat7

#java #веб-сервисы #jax-ws #java-metro-framework #tomcat7

Вопрос:

Я пытаюсь создать простой веб-сервис с использованием Tomcat 7.0.11 на Windows Server 2008 R2 с использованием Metro 2.1. Я исходил из фона C # / WCF, пытаясь лучше понять совместимость веб-служб. На самом деле я следую примеру из книги Мартина Калина «Веб-службы Java запущены». У меня есть следующее:

 CATALINA_HOME=c:tomcat-7.0.11
  

в файле catalina.properties у меня есть:

 server.loader=c:/metro-2.1/bin/*.jar 
  

(обратите внимание, я также пытался добавить этот путь в common.loader).

Я скопировал следующие файлы METRO jar в CALALINA_HOME lib:

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

и в CALALINA_HOME одобрено:

webservices-api.jar

(обратите внимание, изначально я пытался использовать metro-on-tomcat.xml файл ant, но, похоже, он не был обновлен для tomcat 7. *)

Я также скопировал webservices-api.jar в JAVA_HOME jre lib одобрено

Я также пытался поместить другие банки METRO в вышеуказанные местоположения, но безрезультатно.

Теперь Tomcat запускается нормально и инициализирует METRO ok, вот соответствующий раздел из файла журнала catalina:

ИНФОРМАЦИЯ: Развертывание корневого каталога веб-приложения 18 мая 2011 08:00:55 com.sun.xml.ws.transport.http.servlet.ИНФОРМАЦИЯ о инициализации контекста WSServletContextListener: WSSERVLET12: инициализация прослушивателя контекста JAX-WS 18 мая 2011 08:01:07 com.sun.xml.ws.server.ИНФОРМАЦИЯ о создании базы мониторинга: корневое имя мониторинга Metro успешно установлено в: com.sun.metro: pp=/, тип = WSEndpoint, имя =-TempConvertImplService-TempConvertImplPort 18 мая 2011 08:01:08 com.sun.xml.ws.transport.http.servlet.ИНФОРМАЦИЯ о WSServletDelegate: WSSERVLET14: инициализация сервлета JAX-WS

Исходя из этого, можно подумать, что Tomcat загрузил все классы METRO. Из того, что я собрал, WSServlet является частью JAX-WS 2.1, который поставляется как часть METRO, поэтому он должен был быть загружен. Но когда я на самом деле пытаюсь перейти к WSDL моего сервиса, я получаю следующее в журнале localhost:

СЕРЬЕЗНОЕ: выделение исключения для сервлета преобразует TEMP в java.lang.Исключение ClassNotFoundException: com.sun.xml.ws.transport.http.WSServlet в org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1676) в org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1521) в org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:415)…. (остальная часть трассировки стека)

мой sun-jaxws.xml выглядит следующим образом:

 <endpoints xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime" version="2.0">
  <endpoint
      name="TempConvertWS"
      implementation="TimeServer.TempConvertImpl"
      url-pattern="/tc"
    />
</endpoints>
  

и соответствующий раздел из моего web.xml файл является:

   <listener>
    <listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>
  </listener>
  <servlet>
    <servlet-name>TempConvertWS</servlet-name>
    <servlet-class>com.sun.xml.ws.transport.http.WSServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>TempConvertWS</servlet-name>
    <url-pattern>/tc</url-pattern>
  </servlet-mapping>
  

Кто-нибудь может понять из этого, почему Tomcat не может найти / загрузить класс WSServlet при просмотре сервиса?

Комментарии:

1. для этого требуются библиотеки jaxws-ri, которые, я думаю, jaxws-api.jar, jaxws-rt.jar, jaxws-tools.jar, streambuffer.jar стоит упомянуть, но это лишь некоторые. убедитесь, что они в CATALINA_HOME/lib

Ответ №1:

С Tomcat 6 я установил shared.loader в catalina.properties и добавил webservices-api.jar для <catalina-home>endorsed

Это сработало как по волшебству.

В целях разработки и тестирования вы могли бы просто поместить webservices-extra.jar , webservices-extra-api.jar , webservices-rt.jar веб-сервисы-инструменты.jar в <catalina-home>/lib вместо использования директивы shared.loader. Я считаю, что это также более совместимо с Eclipse.

Я протестирую Tomcat 7, чтобы увидеть, отличается ли он каким-либо образом.

* Обновление: тот же трюк работает для Tomcat 7.0.14

* Update2: Извините, я не заметил этого сразу, но я только что заметил, что в вашем web.xml указанное <servlet-class> неверно. Это должно быть com.sun.xml.ws.transport.http.servlet.WSServlet

Комментарии:

1. вам удалось заставить это работать? если да, можете ли вы предоставить решение для дальнейшего использования?