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

40

当我尝试运行"mvn generate-sources"时,输出如下:

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>

我做错了什么?在项目“gensourcesfromwsdl”中存在包com,且WSDL位置有效。

当我通过命令行运行wsimportwsimport -keep -verbose http://mysite/firstwsdl.asmx?wsdl时,该类被生成。


你有没有找到解决这个问题的方法?我也卡在同样的问题上了。 - Oliver Watkins
@Oliver Watkins,恐怕不行,我最终是在Maven之外生成了这些类。这个链接可能会对你有所帮助:https://dev59.com/vWw05IYBdhLWcg3w9mdW - blue-sky
7个回答

52

要从WSDL生成类,你只需要在pom.xml中加入build-helper-maven-plugin 和 jaxws-maven-plugin。
确保将wsdl放置在src/main/resources/wsdl文件夹下,相应的模式文件放置在src/main/resources/schema文件夹下,然后在项目根目录下运行命令“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
这可能是一个愚蠢的问题,但是build-helper-maven-plugin是用来做什么的?它和jaxws-maven-plugin有什么不同? - Silly Sally
4
@SillySally jaxws-maven-plugin会执行wsimport步骤,从Web服务定义语言(wsdl、xsd文件)生成Java代码。 该代码将生成到专用文件夹/target/generated...中。 build-helper-maven-plugin是一个插件,将声明附加源文件夹(除了传统的src/main/java文件夹之外,还添加/target/generated...)。 (没有愚蠢的问题!^:p) - boly38
6
啊,好的。但是还有一个问题,为什么我们不直接在src/main/java下生成代码呢? - Silly Sally
7
@SillySally,这是为了避免你编写的代码和必须保持不变的生成代码之间产生混淆。;) - boly38
2
@SillySally,否则版本管理系统(svn / etc.)将始终在生成后注意到更改的源代码,在自动化构建环境中会非常混乱。 - fl0w
显示剩余5条评论

29

这里是如何使用Jaxws Maven插件从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>  

:这是一个空段落标签。

如何在Maven中运行此程序? - Zeus
4
在您的IDE中使用目标jaxws:wsimport运行Maven,或者在命令提示符中运行mvn jaxws:wsimport。 - Cassian
1
只需添加必要的<phase>,就可以定期使用mvn构建它。 - Hunkeone
Kadiri也使用了build-helper-maven-plugin - 为什么你不使用它,它的功能区别是什么? - Zon

6
即使这是回答有点晚了,对于某些人可能会有所帮助。看起来你已经使用了 pluginManagement。如果你使用 pluginManagement,它不会执行插件。应该放在下面:
<build>
<plugins>           
        <plugin> 

我刚刚提交了一份编辑,正如你所指出的,这可能对每个人都不清楚,特别是那些可能会找到答案的Maven初学者。 - fl0w

3
我看到一些人更喜欢通过jaxws-maven-plugin将源代码生成到目标中,并通过build-helper-maven-plugin使这些类在源代码中可见。作为这种结构的一个论据,版本管理系统(svn等)会始终注意到更改后的源代码。但在git中并非如此。因此,您只需配置jaxws-maven-plugin将它们放在您的源代码中,而不是target文件夹中。下次构建项目时,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);

3

试着将wsdlLocation包含在wsdlUrls中。

            <wsdlUrls>
                <wsdlLocation>http://url</wsdlLocation>
            </wsdlUrls>

确实,没有<wsdlUrls>块,mvn install仍然可以工作......但是没有生成任何文件,这个问题困扰了我一段时间。 - Junchen Liu
你是最棒的,伙计!我浪费了两个小时才弄清楚这个。 - Yuriy Tsarkov

0
我在使用wsimport目标生成类时遇到了同样的问题。我在Eclipse Maven Build中使用的是clean compile install,无法从wsdl文件生成代码。感谢上面的示例。 在Eclipse IDE中运行jaxws:wsimport目标,它会正常工作。

0
关键在于保持wsimport选项。它是使用元素进行配置的。 关于来自wsimport文档的keep:
-keep                     keep generated files

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接