Как заставить клиента JAX-WS работать на Weblogic 9.2 с помощью ant - PullRequest
4 голосов
/ 21 мая 2010

У меня недавно было много проблем при попытке развернуть клиент веб-службы JAX-WS в Weblogic 9.2. Оказалось, что нет простого руководства о том, как этого добиться, поэтому я решил собрать эту короткую вики-статью, надеясь, что она будет полезна для других.

Во-первых, Weblogic 9.2 не поддерживает веб-сервисы, использующие JAX-WS в целом. Он поставляется со старыми версиями Java-библиотек, связанных с XML, которые несовместимы с последними версиями JAX-WS (аналогичные проблемы возникают с Axis2, только Axis1 работает безупречно с Weblogic 9.x, но это очень старая и неподдерживаемая библиотека).

Итак, чтобы заставить его работать, требуется взлом. Вот как я это сделал (обратите внимание, что мы используем ant в нашем устаревшем корпоративном проекте, вы, вероятно, должны использовать maven, который должен исключить 50% из этих шагов ниже):

1.Загрузите последний дистрибутив JAX-WS с https://jax -ws.dev.java.net / (точная версия, которую я получил, была JAXWS2.2-20091203.zip)

2. Поместите файлы JAX-WS с зависимостями в отдельную папку, например lib / webservices .

3.Создайте набор шаблонов в ant для ссылки на эти банки:

<?xml version="1.0"?>
<patternset id="jaxws.classpath">
<include name="webservices/jsr173_api.jar" />  
<include name="webservices/jsr181-api.jar" />       
<include name="webservices/jaxb-api.jar" />
<include name="webservices/jaxb-impl.jar" />
<include name="webservices/jaxb-xjc.jar" /> 
<include name="webservices/jaxws-tools.jar" />
<include name="webservices/jaxws-rt.jar" />       
<include name="webservices/jaxws-api.jar" />
<include name="webservices/policy.jar" />
<include name="webservices/woodstox.jar" />   
<include name="webservices/streambuffer.jar" />       
<include name="webservices/stax-ex.jar" />
<include name="webservices/saaj-api.jar" />
<include name="webservices/saaj-impl.jar" />
<include name="webservices/gmbal-api-only.jar" />   
</patternset>

4. Включите набор паттернов в вашу цель, связанную с WAR. Это может выглядеть примерно так:

<?xml version="1.0"?>
<copy todir="${wardir.lib}" includeEmptyDirs="false" flatten="true">
<fileset dir="${libs}">
<!--lots of libs here, related to your project -->
<patternset refid="jaxws.classpath"/>
</fileset>
</copy>

(не параметр flatten = "true" - это важно, поскольку Weblogic 9.x по умолчанию недостаточно интеллектуален для доступа к банкам, расположенным в другом местоположении, чем WEB-INF / lib внутри вашего файла WAR )

5. В случае столкновений Weblogic по умолчанию использует свои собственные jar-файлы. Мы хотим, чтобы вместо этого мы использовали jar-файлы JAX-WS из нашего приложения. Это достигается путем подготовки файла weblogic-application.xml и помещения его в папку META-INF развернутого файла EAR. Это должно выглядеть так:

<?xml version="1.0"?>
<weblogic-application xmlns="http://www.bea.com/ns/weblogic/90" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<prefer-application-packages>
    <package-name>javax.jws.*</package-name>
    <package-name>javax.xml.bind.*</package-name>
    <package-name>javax.xml.crypto.*</package-name>
    <package-name>javax.xml.registry.*</package-name>
    <package-name>javax.xml.rpc.*</package-name>
    <package-name>javax.xml.soap.*</package-name>
    <package-name>javax.xml.stream.*</package-name>
    <package-name>javax.xml.ws.*</package-name>
    <package-name>com.sun.xml.api.streaming.*</package-name>
</prefer-application-packages>
</weblogic-application>

6.Не забудьте поместить этот файл weblogic-application.xml в EAR! Цель муравья для этого может выглядеть примерно так:

<?xml version="1.0"?>
<target name="build-ear" depends="war, manifest">
    <delete dir="${dist}"/>
    <mkdir dir="${dist}"/>    
    <jar destfile="${warfile}" basedir="${wardir}"/>        
    <ear destfile="${earfile}" appxml="resources/${app.name}/application.xml">
        <fileset dir="${dist}" includes="${app.name}.war"/>
        <metainf dir="resources/META-INF"/>     
    </ear>
</target>

7. Также вам нужно указать weblogic, чтобы вы предпочитали ваши классы WEB-INF тем, которые находятся в распространении. Это можно сделать, поместив в файл WEB-INF / weblogic.xml следующие строки:

<?xml version="1.0"?>
<container-descriptor>
    <prefer-web-inf-classes>true</prefer-web-inf-classes>
</container-descriptor>

8. И это все для конфигурации, связанной с weblogic. Теперь только установите свою цель JAX-WS. В приведенном ниже примере мы просто создадим заглушки и классы веб-служб на основе локально развернутого файла WSDL и поместим их в папку в вашем приложении:

<?xml version="1.0"?>
<target name="generate-jaxws-client">
        <taskdef name="wsimport" classname="com.sun.tools.ws.ant.WsImport"> 
            <classpath path="classpath.main"/>
        </taskdef>          
        <wsimport 
             destdir="${src}"
             package="acme.somewhere.in.your.package.tree.webservices."
             keep="true" 
             wsdl="http://localhost:8088/mockWebService?WSDL">              
        </wsimport>
    </target>   

Помните о параметре keep = "true". Без него wsimport генерирует классы и ... удаляет их, хотите верьте, хотите нет!

Для насмешки над веб-сервисом я предлагаю использовать SOAPUI, проект с открытым исходным кодом. Очень прост в развертывании, крайне важен для тестирования интеграции веб-сервисов.

9. Мы почти у цели. Наконец, нужно написать класс Java для тестирования веб-службы, сначала попытаться запустить его как отдельное приложение (или как часть ваших модульных тестов)

10. А затем попробуйте запустить тот же код из Weblogic. Он должен работать. Это сработало для меня. Примерно через 3 дня разочарования. И да, я знаю, что я должен был поставить 9 и 10 под одним маркером, но заголовок «10 шагов по развертыванию веб-службы JAX-WS в Web-логике 9.2 с использованием ant» звучит гораздо лучше.

Пожалуйста, отредактируйте этот пост и улучшите его, если вы обнаружите, что чего-то не хватает!

Ответы [ 2 ]

2 голосов
/ 02 июня 2010

Другим способом работы с веб-сервисами в Weblogic 9.2 является использование Apache CXF. Это особенно хорошо интегрируется с Spring, поскольку каждый веб-сервис представлен в виде bean-компонента, и реальным классам даже не нужно знать, что они являются веб-сервисами, все зависит от конфигурации.

Отличное руководство по настройке Apache CXF в Weblogic можно найти здесь: http://wheelersoftware.com/articles/spring-cxf-web-services.html

Это работает и в Weblogic 9.2, и если вам нужно предоставлять веб-сервисы, а не просто подключаться к существующим, этот подход намного лучше, чем использование простого JAXWS (который в любом случае используется CXF).

2 голосов
/ 21 мая 2010

Это на самом деле не вопрос, а руководство, поэтому я отвечаю на него сам, просто чтобы пометить его как выполненное.

...