Utiliser Maven pour déclencher une wsgen & wsimport en ligne, à l'aide wsdlLocation
J'ai des moments difficiles à l'aide de maven pour générer mon client. Reportez-vous donc à La création d'un web-service client directement à partir de la source pour la première partie de ma question.
Pour faire simple et court, je veux aller à partir d'ici (un fichier dans le répertoire src/main/java) :
package com.example.maven.jaxws.helloservice;
import javax.jws.WebService;
@WebService
public class Hello {
public String sayHello(String param) {
; return "Hello " + param;
}
}
à là :
/**
* This class was generated by the JAX-WS RI.
* JAX-WS RI 2.1.7-b01-
* Generated source version: 2.1
*
*/
@WebServiceClient(name = "HelloService", targetNamespace = "http://helloservice.jaxws.maven.example.com/", wsdlLocation = "http://localhost:8080/test/")
public class HelloService
extends Service
{
private final static URL HELLOSERVICE_WSDL_LOCATION;
private final static Logger logger = Logger.getLogger(com.example.wsimport.HelloService.class.getName());
...etc
à l'aide de seulement 1 pom.xml fichier.
Veuillez noter que le wsdlLocation définie sur la fin.
L'pom.xml le fichier sera probablement utiliser à la fois maven-jaxws-plugin wsgen ET wsimport avec des problèmes de configuration pour atteindre cet objectif.
OriginalL'auteur ben | 2010-01-28
Vous devez vous connecter pour publier un commentaire.
En supposant, vous n'allez pas essayer d'utiliser les bouchons, dans le même projet que vous êtes en train de faire cela (ce qui permettrait de créer des dépendances circulaires et d'être une mauvaise idée...) alors, oui, vous pouvez faire quelque chose comme cela.
La config n'est pas du tout compliqué, en fait il faudrait en quelque deviné dans votre question, mais va ici:
Mise à jour - pour emballer le code généré dans un bocal je voudrais utiliser le maven-jar-plugin comme suit:
J'ai collé rapidement ce à partir de notre config, mais notre utilisation est un peu différente (comme nous le zip les fichiers wsdl pas le client généré, mais je crois que ça va vous obtenir assez proche). Vous aurez probablement à l'installation de la version pour le maven-jar-plugin si vous n'êtes pas déjà en utilisant elle - 2.3.1 semble être la dernière.
Vous êtes les bienvenus - j'ai mis à jour ma réponse avec un autre pom fragment qui devrait vous obtenir un peu plus près.
Ai-je raison de dire que la wsgen objectif génère le fichier wsdl à partir du code java, et que le wsimport objectif génère le client (et les pojo) à partir du fichier wsdl?
OriginalL'auteur macbutch
J'ai réussi à le même processus. L'objectif est de créer un proxy de service web JAR pour les services web dans notre application.
Services Web
Nous avons trois services web dans notre application (pour l'instant). Ils sont créés par un projet Maven qui construit une GUERRE avec le service et le soutien des classes, qui contient un
sun-jaxws.xml
descripteur ainsi queweb.xml
.Le service web de projet Maven est partie d'un multi-projet de construction de la web-service, la GUERRE est un module dans une OREILLE qui a aussi un JAR EJB interface-utilisateur, la GUERRE et autres Pots (ainsi que les dépendances).
Client proxy POT
Idéalement, je voudrais créer le proxy client BOCAL dans un autre projet Maven qui dépend du service web de la GUERRE de projet et utilise le Maven JAX-WS plugin objectifs
wsgen
suivie parwsimport
pour faire le travail.Mais je ne pouvais pas obtenir un projet Maven à utiliser la GUERRE comme un depedency de sorte que les ses classes (dans
WEB-INF/classes
) sont ajoutés au chemin de classe. J'ai essayé le AppFuse Warpath plugin, mais ne pouvait pas l'obtenir pour décompresser de la GUERRE de dépendance.Deux objets à partir d'un projet Maven
En fin de compte, j'ai dû recourir à la construction et à l'installation de plusieurs artefacts dans un projet Maven. Mes découvertes sur
wsgen
etwsimport
et le second artefact:jaxws-maven-plugin
besoins de ses propres dépendances pour lewsgen
but si elles sont en dehors du projet en cours, sinon il ne peut pas les trouver. (Même siverbose
est définietrue
cet objectif n'émet que peu d'informations utiles.)wsgen
objectif doit être appelée pour chaque service à générer un fichier WSDL.wsimport
but est appelée une fois pour tous les fichiers wsdl à la fois parce que les services partagent un certain nombre de classes de soutien. (Parce que toutes les classes générées aller dans l'un proxy client forfait, il est important de ne pas avoir de chevauchement des noms de classe à travers les sources d'origine, même s'ils proviennent de différents paquets).maven-jar-plugin:jar
etmaven-install-plugin:install-file
sont appelés à forfait et installer le client du proxy JAR.Ci-dessous sont des éléments clés de la POM avec certains commentaires:
OriginalL'auteur pharsicle
De course wsgen puis wsimport puis wsgen puis wsimport permettra d'atteindre ce dont vous avez besoin, mais vous maven ne vous permettra pas de construire un module de deux fois. Pour contourner ce problème, vous pouvez exécuter maven comme une fourmi exec tâche, qui s'appuie mvn install dans le répertoire courant, attaché à la validation de la phase du cycle de production. Cela va faire un wsimport puis un wsgen, puis, quand la construction se prolonge au-delà de la validation de cycle il en reprise wsimport (maintenant sur le nouvellement créé wsgen) et puis wsgen de nouveau. Cela vous permet d'avoir un service web et un client web qui utilise ce service construit sur le même module maven.
Placer le plugin déclaration dans votre maven pom.xml build fichier:
OriginalL'auteur Barak