代码之家  ›  专栏  ›  技术社区  ›  blue-sky

如何使用Maven和wsimport从wsdl生成类?

  •  40
  • blue-sky  · 技术社区  · 12 年前

    当我尝试运行“mvn生成源代码”时,这是我的输出:

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

    我没有收到任何错误,但没有从wsdl文件生成java类。

    这是我运行插件时使用的pom.xml文件:

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

    我做错了什么?包裹 com 存在于项目“gensourcesfromwsdl”中,并且wsdl位置是有效的。

    当我跑步时 wsimport 通过命令行:> wsimport -keep -verbose http://mysite/firstwsdl.asmx?wsdl 生成类。

    7 回复  |  直到 9 年前
        1
  •  52
  •   Ondra Žižka David Lilljegren    5 年前

    要从WSDL生成类,您只需要在pom.xml中构建helper maven插件和jaxws-maven插件
    确保您已将wsdl放置在src/main/resources/wsdl文件夹下,并将相应的模式放置在src/main/resources/schema中,从Project根目录运行命令“mvn generate sources”。

    C:/Project root directory > mvn generate-sources
    

    生成的java类可以位于文件夹下

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

    pom.xml片段

    <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>${project.build.directory}/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>${project.basedir}/src/main/resources/wsdl</wsdlDirectory>
            <packageName>com.raps.code.generate.ws</packageName>
            <keep>true</keep>
            <sourceDestDir>${project.build.directory}/generated/src/main/java</sourceDestDir>
        </configuration>
        <executions>
            <execution> 
                <id>myImport</id>
                <goals><goal>wsimport</goal></goals>
            </execution>
        </executions>
    </plugin>
    
        2
  •  29
  •   Cassian    11 年前

    下面是一个示例,说明如何使用jaxws-maven插件从wsdl中从url或文件位置生成类(注释来自wsdl文件位置)。

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

        3
  •  6
  •   Midhun    8 年前

    尽管这是一个有点晚的回应,但可能对某人有所帮助。看起来你已经使用了插件管理。如果您使用插件管理 ,它不会选择插件执行。

    它应该在下面

    <build>
    <plugins>           
            <plugin> 
    
        4
  •  3
  •   Alexander Pronin    11 年前

    尝试将wsdlLocation包装在wsdlUrls中

                <wsdlUrls>
                    <wsdlLocation>http://url</wsdlLocation>
                </wsdlUrls>
    
        5
  •  3
  •   Alexandr    5 年前

    我看到有些人更喜欢通过jaxws-maven插件将源代码生成到目标中,并通过构建助手maven插件使这些类在源代码中可见。作为该结构的论据

    版本管理系统(svn/等)总是会注意到更改 来源

    对于git来说,这不是真的。所以你可以配置 jaxws-maven-plugin 将它们放入源文件中,但不要放在目标文件夹下。下次构建项目时,git不会将这些生成的文件标记为已更改。以下是仅使用一个插件的简单解决方案:

          <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>jaxws-maven-plugin</artifactId>
            <version>2.6</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>
              <wsdlLocation>META-INF/wsdl/soap.wsdl</wsdlLocation>
            </configuration>
          </execution>
        </executions>
      </plugin>
    

    此外(需要注意的是)在本例中,SOAP类是使用Fluent API生成的,因此您可以创建它们,如下所示:

    A a = new A()
      .withField1(value1)
      .withField2(value2);
    
        6
  •  0
  •   Gaurav    10 年前

    这里的关键是wsimport的保留选项。并且它是使用中的元素配置的 关于保留wsimport文档:

    -keep                     keep generated files
    
        7
  •  0
  •   Waqas Ahmed    8 年前

    我在从wsimport目标生成类时也遇到了同样的问题。我没有在eclipse Maven Build中使用jaxws:wsimport目标,而是使用了无法从wsdl文件生成代码的干净编译安装。多亏了上面的例子。 从Eclipseide运行jaxws:wsimport目标,它就可以工作了