web-dev-qa-db-fra.com

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

Lorsque j'essaie d'exécuter "mvn generate-sources", voici mon résultat: 

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 fichier pom.xml contre 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 mal ? Le paquetage com existe dans le projet 'gensourcesfromwsdl' et l'emplacement wsdl est valide.

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

26
blue-sky

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 dans 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.

extrait de pom.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>
32
Prahallad Kadiri

Voici un exemple de la façon de générer des classes à partir de wsdl avec le plug-in jaxws maven à partir d'une URL ou d'un emplacement de fichier (l'emplacement de 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>  

24
Cassian

Même si la réponse est un peu tardive, cela peut être utile pour quelqu'un. On dirait que vous avez utilisé pluginManagement. Si vous utilisez pluginManagement , L'exécution du plug-in ne sera pas sélectionnée.

Il devrait être sous 

<build>
<plugins>           
        <plugin> 
3
Midhun

Essayez d'encapsuler wsdlLocation dans wsdlUrls

            <wsdlUrls>
                <wsdlLocation>http://url</wsdlLocation>
            </wsdlUrls>
3
Alexander Pronin

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 le source via build-helper-maven-plugin. Comme argument pour cette structure 

le système de gestion de versions (svn/etc.) remarquerait toujours que les modifications ont été apportées sources

Avec Git ce n'est pas vrai. Donc, vous pouvez simplement configurer jaxws-maven-plugin pour les mettre dans vos sources, mais pas dans le dossier cible. La prochaine fois que vous construirez votre projet, git ne marquera pas ces fichiers générés comme 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, dans cet exemple, les classes SOAP sont générées avec l'API Fluent. Vous pouvez donc les créer comme suit:

A a = new A()
  .withField1(value1)
  .withField2(value2);
1
Alexandr

La clé ici est de conserver l'option de wsimport. Et il est configuré en utilisant element dans À propos de keep de la documentation wsimport

-keep                     keep generated files
0
Gaurav

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 dans Eclipse Maven Build, j'utilisais une installation de compilation propre qui ne permettait pas de générer du code à partir d'un fichier wsdl. Merci à l'exemple ci-dessus . Exécutez jaxws: wsimport target depuis Eclipse ide et cela fonctionnera

0
Waqas Ahmed