Comment générer des classes à partir de wsdl en utilisant Maven et wsimport?

Lorsque j'essaie d'exécuter "mvn generate-sources", c'est ma sortie:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building gensourcesfromwsdl 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.104s
[INFO] Finished at: Tue Aug 20 15:41:10 BST 2013
[INFO] Final Memory: 2M/15M
[INFO] ------------------------------------------------------------------------

Je ne reçois aucune erreur mais il n'y a pas de classes java générées à partir du fichier wsdl.

Voici mon pompon.fichier xml sur lequel j'exécute le plugin:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>gensourcesfromwsdl</groupId>
    <artifactId>gensourcesfromwsdl</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>jaxws-maven-plugin</artifactId>
                    <version>1.12</version>
                    <executions>
                        <execution>
                            <goals>
                                <goal>wsimport</goal>
                            </goals>
                            <configuration>
                                <wsdlLocation>http://mysite/firstwsdl.asmx?wsdl</wsdlLocation>
                                <packageName>com</packageName>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>

</project>

Qu'est-ce que je fais de mal ? Le paquet com existe dans le projet 'gensourcesfromwsdl' et l'emplacement wsdl est valide.

Quand je lance wsimport via la ligne de commande : >wsimport -keep -verbose http://mysite/firstwsdl.asmx?wsdl la classe est générée.

25
demandé sur andand 2013-08-20 18:50:49

7 réponses

Pour générer des classes à partir de WSDL, tout ce dont vous avez besoin est build-helper-Maven-plugin et jaxws-maven-plugin dans votre pom.xml
Assurez-vous d'avoir placé wsdl sous le dossier src/main/resources/WSDL et le schéma correspondant dans src/main/resources/schema, exécutez la commande "mvn generate-sources" à partir du répertoire racine du projet.

C:/Project root directory > mvn generate-sources

Les classes java générées peuvent être situées sous le dossier

target/generated/src/main/java/com/raps/code/generate/ws.

Pom.extrait xml

<basedir>
    C:/Project root directory
</basedir>

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>build-helper-maven-plugin</artifactId>
    <version>1.9</version>
    <executions>
        <execution>
            <id>add-source</id>
            <phase>generate-sources</phase>
            <goals>
                <goal>add-source</goal>
            </goals>
            <configuration>
                <sources>
                    <source>${basedir}/target/generated/src/main/java</source>
                </sources>
            </configuration>
        </execution>
    </executions>
</plugin>

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>jaxws-maven-plugin</artifactId>
    <version>1.12</version>
    <configuration>
        <wsdlDirectory>${basedir}/src/main/resources/wsdl</wsdlDirectory>
        <packageName>com.raps.code.generate.ws</packageName>
        <keep>true</keep>
        <sourceDestDir>${basedir}/target/generated/src/main/java</sourceDestDir>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>wsimport</goal>
            </goals>
        </execution>
    </executions>
</plugin>
30
répondu Prahallad Kadiri 2016-10-28 17:59:55

Voici un exemple de la façon de générer des classes à partir de wsdl avec le plugin jaxws maven à partir d'une url ou d'un emplacement de fichier (à partir de l'emplacement du fichier wsdl est commenté).

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<build>  
    <plugins>           
        <!-- usage of jax-ws maven plugin-->
        <plugin> 
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>jaxws-maven-plugin</artifactId>
            <version>1.12</version>
            <executions> 
                <execution> 
                    <id>wsimport-from-jdk</id>
                    <goals>
                        <goal>wsimport</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <!-- using wsdl from an url -->
                <wsdlUrls>
                    <wsdlUrl>
                        http://myWSDLurl?wsdl
                    </wsdlUrl>
                </wsdlUrls>
                <!-- or using wsdls file directory -->
                    <!-- <wsdlDirectory>src/wsdl</wsdlDirectory> -->
                <!-- which wsdl file -->
                <!-- <wsdlFiles> -->
                    <!-- <wsdlFile>myWSDL.wsdl</wsdlFile> -->
                <!--</wsdlFiles> -->
                <!-- Keep generated files -->
                <keep>true</keep> 
                <!-- Package name --> 
                <packageName>com.organization.name</packageName> 
                <!-- generated source files destination-->
                <sourceDestDir>target/generatedclasses</sourceDestDir>
            </configuration>
        </plugin>
    </plugins>  
</build>  

22
répondu Cassian 2015-03-06 13:01:35

Essayez d'envelopper wsdlLocation dans wsdlUrls

            <wsdlUrls>
                <wsdlLocation>http://url</wsdlLocation>
            </wsdlUrls>
3
répondu user788660 2014-12-01 09:14:56

Même si c'est une réponse un peu tardive, peut être utile pour quelqu'un. Regardez comme vous avez utilisé pluginManagement. Si vous utilisez pluginManagement , il ne choisira pas l'exécution du plug-in.

, Il devrait être sous -

<build>
<plugins>           
        <plugin> 
3
répondu Midhun 2018-01-26 20:27:53

Je vois que certaines personnes préfèrent générer des sources dans la cible via jaxws-Maven-plugin et rendre ces classes visibles dans la source via build-helper-maven-plugin. Comme argument pour cette structure

Le système de gestion des versions (svn / etc.) remarquerait toujours changé sources

Avec git ce n'est pas vrai. Vous pouvez donc simplement configurer jaxws-maven-plugin pour les placer dans vos sources, mais pas dans le dossier cible. La prochaine fois que vous construisez votre projet, git ne les marquera pas fichiers générés tels que modifiés. Voici la solution simple avec un seul plugin:

      <plugin>
        <groupId>org.jvnet.jax-ws-commons</groupId>
        <artifactId>jaxws-maven-plugin</artifactId>
        <version>2.3</version>

    <dependencies>
      <dependency>
        <groupId>org.jvnet.jaxb2_commons</groupId>
        <artifactId>jaxb2-fluent-api</artifactId>
        <version>3.0</version>
      </dependency>
      <dependency>
        <groupId>com.sun.xml.ws</groupId>
        <artifactId>jaxws-tools</artifactId>
        <version>2.3.0</version>
      </dependency>
    </dependencies>

    <executions>
      <execution>
        <goals>
          <goal>wsimport</goal>
        </goals>
        <configuration>
          <packageName>som.path.generated</packageName>
          <xjcArgs>
            <xjcArg>-Xfluent-api</xjcArg>
          </xjcArgs>
          <verbose>true</verbose>
          <keep>true</keep> <!--used by default-->
          <sourceDestDir>${project.build.sourceDirectory}</sourceDestDir>
          <wsdlDirectory>src/main/resources/META-INF/wsdl</wsdlDirectory> 
        </configuration>
      </execution>
    </executions>
  </plugin>

De plus (juste pour noter) dans cet exemple, les classes SOAP sont générées avec L'API Fluent, de sorte que vous pouvez les créer comme:

A a = new A()
  .withField1(value1)
  .withField2(value2);
1
répondu Alexandr 2018-09-07 11:04:48

La clé ici est keep option de wsimport. Et il est configuré en utilisant element in À propos de keep de la documentation wsimport:

-keep                     keep generated files
0
répondu Gaurav 2015-09-14 17:48:52

J'avais le même problème lors de la génération des classes à partir de l'objectif wsimport. Au lieu d'utiliser jaxws:wsimport goal dans eclipse Maven Build, j'utilisais clean compile install qui n'était pas capable de générer du code à partir du fichier wsdl. Grâce à l'exemple ci-dessus. Exécutez jaxws: wsimport goal À partir de L'ide Eclipse et cela fonctionnera

0
répondu Waqas Ahmed 2018-01-07 08:49:43