Внедрение JAX-WS с Java?

У меня есть приложение веб-службы JAX-WS, которое развертывается в качестве файла WAR для Tomcat 7. В нем используется последняя версия библиотек Metro, которую я включаю в WAR файл, и она отлично работает.

Я пытаюсь упростить пакет развертывания. Я понимаю, что Sun JDK включает копию Metro (см. этот вопрос и этот), но по какой-то причине, по-видимому, обязательным является замена этой копии метро на один, загруженный с сайта морской рыбы. Я пытаюсь понять, можно ли с ним справиться только с Tomcat и реализацией метро, ​​которая поставляется с JDK, или если нет, почему бы и нет.

Содержимое WAR выглядит следующим образом (файлы классов удалены):

META-INF/MANIFEST.MF
WEB-INF/classes/
WEB-INF/classes/com/[et cetera]
WEB-INF/ibm-web-ext.xml
WEB-INF/lib/
WEB-INF/lib/stax-api.jar
WEB-INF/lib/webservices-api.jar
WEB-INF/lib/webservices-extra-api.jar
WEB-INF/lib/webservices-extra.jar
WEB-INF/lib/webservices-rt.jar
WEB-INF/lib/webservices-tools.jar
WEB-INF/sun-jaxws.xml
WEB-INF/web.xml
wsdl/
wsdl/MyService.wsdl

web.xml содержит, в частности:

<servlet>
    <servlet-name>MyService</servlet-name>
    <servlet-class>
        com.sun.xml.ws.transport.http.servlet.WSServlet
    </servlet-class>              
</servlet>

Когда я удаляю webservices- * jars - банки Metro - из WAR, веб-служба терпит неудачу с ошибкой "Wrapper не может найти класс сервлета com.sun.xml.ws.transport.http.servlet.WSServlet или класс зависит от". Это не удивительно, потому что я не могу найти этот класс где-нибудь в банках, которые поставляются с Java 7 SE.

Итак, что значит сказать, что Java 7 поставляется с Metro, если вам нужно загрузить еще одну копию Metro, чтобы сделать что-то вроде этой работы? Возможно ли запустить веб-службу JAX-WS в Tomcat, используя только банки, которые поставляются с Java?

Ответ 1

В комплекте JAX-WS отсутствует интеграция с контейнерами сервлетов, поскольку он предназначен для использования только для предоставления услуг JAX-WS внутри автономных приложений Java (WTF!?!?!?).

Конечно, можно было подумать о внедрении сервлета, который делает эту интеграцию, поэтому вам не нужно будет включать еще одну копию Metro в вашу WAR. Но проще просто включить внешнюю "полную" копию, она раздувает WAR, но не должна иметь большого штрафа за производительность. Кроме того, таким образом вы можете контролировать, какую версию вы используете, избегая застревания с версией, которая была включена в вашу JRE.

В любом случае, Sun обычно меняет имена пакетов в связанных библиотеках, чтобы они не сталкивались с внешними. Поэтому, если бы сервлет существовал (это не так), его, вероятно, вызывают:

com.sun.xml. внутренний. ws.transport.http.servlet.WSServlet

Это очень раздражает, поскольку они также изменили некоторые свойства конфигурации таким же образом (например, связанные с тайм-аутом), поэтому, если вы используете JAX-WS, вам нужно использовать

com.sun.xml. внутренний.... свойства конфигурации стиля,

но если вы используете какой-то внешний JAX-WS, вы должны использовать

com.sun.xml.... свойства конфигурации стиля.

Спасибо Sun!!

Ответ 2

Итак, что значит сказать, что Java 7 поставляется с Metro..?

Это не совсем правильно. JDK6 + включает JAX-WS RI (эталонная реализация), а Metro - надмножество. Другими словами, Metro = JAX-WS RI + WSIT.

Можно ли запустить веб-службу JAX-WS в Tomcat, используя только банки, которые поставляются с Java?

Это отличный вопрос. Ответ - нет, потому что WSServlet класс extends HttpServlet, а WSServletContextListener реализует интерфейсы ServletContextAttributeListener и ServletContextListener. Эти интерфейсы и классы являются частью Java EE, а не Java SE, поэтому не включены в JDK/JRE. Sun/Oracle решили не смешивать Java SE и Java EE, и это понятно, хотя это означает, что эти классы были фактически удалены из версии JAX-WS RI, которая поставляется с JDK/JRE. Поэтому вам нужно установить зависимости JAX-WS, чтобы использовать веб-службы на основе JAX-WS на Tomcat, потому что Tomcat не приходит с ним (с другой стороны, если вы выбираете Glassfish, например, вы найдете полный Metro дистрибутива в комплекте с ним, и вам не нужно ничего устанавливать дополнительно). В противном случае вы застряли в механизме Endpoint # publish.

См. также:

Ответ 3

Его старый вопрос, но если кто-то все еще ищет ответы. Не нужно включать jaxws jar с JDK 1.7 (я использую точно 1.7.0_45). Использовал ссылку http://www.mkyong.com/webservices/jax-ws/deploy-jax-ws-web-services-on-tomcat/, чтобы создать образец webservice и пропустил шаг 5, и все это работает. Я нацелен на Tomcat версии 7.0.47, весь проект построен с Maven с возможностью по умолчанию для jaxws-rt jars (т.е. Компиляции).