2010-05-21 4 views
4

J'ai récemment eu beaucoup de problèmes en essayant de déployer un client Web Servicie JAX-WS sur Weblogic 9.2. Il s'avère qu'il n'y a pas de guide simple sur la façon d'y parvenir, alors j'ai décidé de mettre en place cette courte entrée wiki en espérant que cela pourrait être utile pour d'autres.Obtenir le client JAX-WS fonctionne sur Weblogic 9.2 avec ant

Premièrement, Weblogic 9.2 ne prend pas en charge les services Web utilisant JAX-WS en général. Il s'agit d'anciennes versions de bibliothèques Java qui sont incompatibles avec le dernier JAX-WS (des problèmes similaires se produisent avec Axis2, seul Axis1 semble fonctionner correctement avec Weblogic 9.x mais c'est une bibliothèque très ancienne et non supportée). Donc, pour que cela fonctionne, un peu de piratage est nécessaire. Voici comment je l'ai fait (notez que nous utilisons ant dans notre projet d'entreprise, vous devriez probablement utiliser Maven qui devrait éliminer 50% de ces étapes ci-dessous):

1.Télécharger le plus récent JAX-WS répartition de https://jax-ws.dev.java.net/ (La version exacte que je suis arrivé était JAXWS2.2-20091203.zip)

2.Place les pots JAX-WS avec les dépendances dans un dossier séparé comme lib/webservices.

3.Créez une patternset en fourmi pour faire référence à ces bocaux:

<?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.Include le patternset dans votre objectif de guerre. Cela pourrait ressembler à:

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

(pas aplatir = « true » paramètre - il est important que Weblogic 9.x est par défaut pas assez intelligent pour pots d'accès situés dans un autre lcoation que WEB-INF/lib dans votre fichier WAR)

5.En cas de conflit, Weblogic utilise ses propres fichiers par défaut. Nous voulons qu'il utilise les fichiers JAX-WS de notre application à la place. Ceci est réalisé en préparant un fichier weblogic-application.xml et en le plaçant dans le dossier META-INF du fichier EAR déploté. Il devrait ressembler à ceci:

<?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.Remember pour placer que weblogic-application.xml fichier dans votre oreille! L'objectif de fourmi pour cela peut ressembler à:

<?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.Also vous devez dire weblogic préférer vos classes WEB-INF à ceux dans la distribution. Vous faites cela en plaçant les lignes suivantes dans votre fichier WEB-INF/weblogic.xml:

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

qu'il est 8. Et pour la configuration liée weblogic. Maintenant, configurez uniquement votre objectif JAX-WS. Celui ci-dessous va générer simplement les talons de service Web et des classes à partir d'un fichier WSDL déployé localement et les placer dans un dossier dans votre application:

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

Rappelez-vous sur le donjon = paramètre « true ». Sans cela, wsimport génère les classes et ... les supprime, croyez-le ou non!

Pour se moquer d'un service web, je suggère d'utiliser SOAPUI, un projet open source. Très facile à déployer, crucial pour les tests d'intergénération des services Web.

9. Nous sommes presque là. La dernière chose est d'écrire une classe Java pour tester le service Web, essayez de l'exécuter en tant qu'application autonome en premier (ou dans le cadre de vos tests unitaires)

10.Et ensuite essayez d'exécuter le même code à partir de Weblogic . Ça devrait marcher. Cela a fonctionné pour moi. Après quelques 3 jours de frustration. Et oui, je sais que j'aurais dû mettre 9 et 10 sous un seul point, mais le titre "10 étapes pour déployer un service Web JAX-WS sous Web logic 9.2 en utilisant fourmi" sonne tellement mieux.

S'il vous plaît, éditez ce post et améliorez-le si vous trouvez quelque chose vous manque!

Répondre

2

Ce n'est pas vraiment une question mais un guide donc je réponds moi-même juste pour le marquer comme fait.

2

Une autre façon de traiter les services Web sur Weblogic 9.2 est d'utiliser Apache CXF. Cela s'intègre particulièrement bien à Spring, car chaque service Web est exposé en tant que bean et les classes réelles n'ont même pas besoin de savoir qu'il s'agit de services Web, tout dépend de la configuration.

Un excellent guide sur la configuration Apache CXF sur Weblogic se trouve ici: http://wheelersoftware.com/articles/spring-cxf-web-services.html

Cela fonctionne sur Weblogic 9.2 aussi bien et si vous avez besoin d'exposer les services Web, non seulement se connecter à ceux qui existent déjà, c'est par bien meilleure approche que l'utilisation de JAXWS simple (qui est utilisé par CXF de toute façon).

Questions connexes