Question

J'essaie de construire un projet Maven, un bundle OSGI, qui contient des services Web. J'utilise jax-ws avec tous les @WebService Annotations pour spécifier les services Web que j'ai. Pour charger ces services Web à un emplacement client que vous utilisez normalement wsgen et wsimport Pour l'exportation / l'importation de fichiers WSDL. J'ai l'intention d'utiliser le Jaxws-Maven-Plugin Pour ce faire, mais voici le problème:

Le bundle peut agir en tant que serveur et client en même temps. Il peut s'inscrire en tant que client à un nœud parent du même bundle (en cours d'exécution sur un autre JVM / hôte). Ainsi, ce projet / bundle Maven définit une interface pour le service Web et définit une classe d'implémentation qui implémente cette interface. L'interface et la classe utilisent le @WebService Annotation comme d'habitude.

@WebService
public interface Example {
    public void callMe();
}

@WebService
public class ExampleImpl implements Example {
    public void callMe() {};
}

Et puis quelque part dans mon code:

Endpoint p = Endpoint.publish(
                 "http://localhost:8080/example",
                 new ExampleImpl());    

La JAXWS: objectif WSGEN lit les annotations et créer les fichiers de sortie (fichiers .class, fichiers .java, fichiers wsdl, selon la configuration ...). Mais comment utiliser ces fichiers pendant le Jaxws: WSIMPORT objectif pour le même mvn package Cours? Dans le même projet Maven, je veux utiliser ce service Web, j'ai donc besoin d'écrire quelque chose comme ceci:

ExampleImplService service = new ExampleImplService();
Example port = service.getExampleImplPort();
port.callMe();

La jaxws:gen L'objectif est en cours d'exécution dans le process-classes phase car elle doit lire les classes compilées, mais jaxws:import doit être exécuté dans le generate-sources phase pour tout préparer pour la compilation. Et maintenant, je cours dans un problème de poulet-œuf. J'ai besoin des classes compilées pour générer les fichiers de sortie via wsgen, mais j'ai besoin des fichiers de sortie de wsgen pour wsimport dans le generate-sources phase de maven. Mon premier essai a été d'attribuer le jaxws:wsgen objectif au generate-sources La phase aussi, mais bien sûr, cela ne fonctionne pas car les classes sont manquantes / non compilées.

Quelles sont mes options pour résoudre ce problème? Devrais-je gérer un antrun Objectif de compilation quelques classes (à savoir uniquement les classes avec le @WebService annotations) Avant le generate-sources phase donc jaxws:wsgen peut l'utiliser (dans cette phase), créer les fichiers de sortie qui sont ensuite utilisés par jaxws:wsimport dans le generate-sources phase? Existe-t-il d'autres moyens de résoudre ce problème de poulet-œuf? Y a-t-il d'autres «manières maven» pour compiller le serveur et la partie client de webservices dans le même projet Maven? Il devrait btw. courir d'un nettoyage mvn clean construire, donc je ne veux pas / comme des solutions comme "Run mvn package Deux fois pour générer d'abord les fichiers Webservices, puis pour compiler tout le reste ". En d'autres termes: mvn clean package Devrait compiler l'ensemble du projet Maven / Osgi.

Était-ce utile?

La solution

J'ai réussi à résoudre ce problème en déplaçant le jaxsw:wsgen objectif au generate-sources phase. J'utilise les étapes suivantes.

  1. Je compile d'abord les cours avec @WebService annotations via un antrun exécution, qui utilise <javac> Pour compiler les classes. J'enregistre les fichiers .class résultants dans un répertoire temporaire qui est supprimé après avoir créé les stubs clients.
  2. Je crée le fichier wsdl à partir des fichiers .classe compilés avec le jaxws:wsgen objectif.
  3. À partir du répertoire temporaire, je crée les talons du client avec la normale jaxws:wsimport objectif.
  4. Je supprime le répertoire temporaire avec une seconde antrun exécution.

Le fichier pom.xml résultant semble être suivant (seulement les parties pertinentes)

<properties>
    <tmpdirectory>${java.io.tmpdir}${file.separator}${user.name}-${project.groupId}-${project.artifactId}</tmpdirectory>
</properties>
...
        <plugin>
            <!-- clean tmp directory at every "mvn clean" -->
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-clean-plugin</artifactId>
            <version>2.4.1</version>
            <configuration>
                <filesets>
                    <fileset>
                        <directory>${tmpdirectory}</directory>
                    </fileset>
                </filesets>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-antrun-plugin</artifactId>
            <version>1.6</version>
            <dependencies>
                  <dependency>
                      <groupId>com.sun</groupId>
                      <artifactId>tools</artifactId>
                      <version>1.6.0</version>
                      <scope>system</scope>
                      <systemPath>${java.home}/../lib/tools.jar</systemPath>
                  </dependency>
            </dependencies>  
            <executions>
                <execution>
                    <!-- compile webservice classes into tmp directory -->
                    <id>mini compile of webservices</id>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>run</goal>
                    </goals>
                    <configuration>
                        <target>
                            <property name="compile_classpath" refid="maven.compile.classpath"/>
                            <mkdir dir="${tmpdirectory}" />
                            <javac includeAntRuntime="false"
                                   classpath="${compile_classpath}"
                                   destdir="${tmpdirectory}">
                                <src path="${project.build.sourceDirectory}" />
                                <include name="org/example/project/*/webservice/*.java" />
                            </javac>
                        </target>
                    </configuration>
                </execution>
                <execution>
                    <!-- delete temporary directory (in case mvn clean is not called) -->
                    <id>clean up tmp dir</id>
                    <phase>process-sources</phase>
                    <goals>
                        <goal>run</goal>
                    </goals>
                    <configuration>
                        <target>
                            <delete dir="${tmpdirectory}" />
                        </target>
                    </configuration>
                </execution>
            </executions>  
        </plugin>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>jaxws-maven-plugin</artifactId>
            <version>1.10</version>
            <executions>
                <execution>
                    <!-- generate WSDL file from the compiled classes in tmp directory -->
                    <id>generate wsdl file</id>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>wsgen</goal>
                    </goals>
                    <configuration>
                        <sei><!-- service endpoint implementation  --></sei>
                        <destDir>${tmpdirectory}</destDir>
                        <genWsdl>true</genWsdl>
                        <resourceDestDir>${tmpdirectory}</resourceDestDir>
                    </configuration>
                </execution>
                <execution>
                    <!-- create client stub files -->
                    <id>create client files from wsdl file</id>
                    <goals>
                        <goal>wsimport</goal>
                    </goals>
                    <configuration>
                        <keep>true</keep>
                        <wsdlDirectory>${tmpdirectory}</wsdlDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>

Autres conseils

Lorsque vous définissez votre plugin, vous devrez configurer deux exécutions distinctes, une pour WSGEN et l'autre WSIMPORT.

... le temps passe ...

Utilisez Maven pour déclencher un WSGEN & WSIMPORT AS

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top