使用jaxb2-maven-plugin从WSDL生成类

24

我在配置jaxb2-maven-plugin时遇到了麻烦,需要从WSDL和多个XSD文件中生成Java类,这些文件都位于同一个标准目录src/main/xsd中。

how to use jaxb2 maven plugin with inline XSD? 这个问题只涉及内联XSDs,答案正确地建议在插件配置中使用wsdl参数,但那个问题确实关注的是内联XSDs,而我的XSDs是外部引用的。

插件目标参数在此处列出here

我的插件配置如下:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>jaxb2-maven-plugin</artifactId>
    <version>1.5</version>
    <executions>
        <execution>
            <id>xjc</id>
            <goals>
                <goal>xjc</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <packageName>com.x.y.model</packageName>
        <wsdl>true</wsdl>
    </configuration>
</plugin>

我正在使用mvn -X clean jaxb2:xjc测试,但插件忽略了.wsdl,这在调试输出中可见。

[DEBUG] accept false for file c:\projects\foo\src\main\xsd\service.wsdl
[DEBUG] accept true for file c:\projects\foo\src\main\xsd\datatypes.xsd
[DEBUG] accept true for file c:\projects\foo\src\main\xsd\more-datatypes.xsd
7个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
26

通过检查传递给JAXB XJC的Maven调试输出和一些试错,我发现我需要向插件提供2个额外的配置参数。

这将停止插件扫描XSD文件,并仅使用.wsdl作为源。例如,XSD文件包含在WSDL中,如<xsd:include schemaLocation="datatypes.xsd" />指令,这些指令在本地解析,从而生成所有来自WSDL和XSD的类型作为Java类。

对我起作用的配置部分是:

<configuration>
    <packageName>com.x.y.model</packageName>
    <wsdl>true</wsdl>
    <xmlschema>false</xmlschema>
    <schemaFiles>service.wsdl</schemaFiles>
</configuration>

如果没有<xmlschema>false</xmlschema>,则Maven将报以下错误:

org.apache.maven.lifecycle.LifecycleExecutionException: 在项目foo上执行目标org.codehaus.mojo:jaxb2-maven-plugin:1.5:xjc(default-cli)失败:无法处理模式: /c:/projects/foo/src/main/xsd/service.wsdl


2
哦,谢谢,这个方法在我没有指定目录并使用默认的 xsd 目录时有效。 - Erich

11

我有一个问题与jaxb2-maven-plugin 2.5.0有关。这是我的解决方案:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>jaxb2-maven-plugin</artifactId>
    <version>2.5.0</version>
    <executions>
        <execution>
            <phase>generate-resources</phase>
            <id>xjc</id>
            <goals>
                <goal>xjc</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <sourceType>wsdl</sourceType>
        <sources>
            <source>${project.basedir}/src/main/resources/wsdl</source>
        </sources>
        <outputDirectory>${project.basedir}/src/main/java</outputDirectory>
        <clearOutputDir>false</clearOutputDir>
        <packageName>com.project.generated</packageName>
        <noPackageLevelAnnotations>true</noPackageLevelAnnotations>
    </configuration>
</plugin>

1
这是错误的配置,配置标签必须在执行标签内部。 - jorghe94

8

如果您正在生成wsdl和xsd,请尝试在不同的执行配置中放置它:它可能没有相同的schemaDirectory,或者插件将无法成功运行第二个执行,因为它基于此变量缓存执行。建议按照以下方式操作:

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>jaxb2-maven-plugin</artifactId>
            <version>1.6</version>
            <executions>
                <execution>
                    <id>generate-sri-facturas</id>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>xjc</goal> 
                    </goals> 
                    <configuration> 
                        <outputDirectory>target/generated-sources/sri</outputDirectory>
                        <packageName>${commonsource.packageName}</packageName> 
                        <schemaDirectory>src/main/resources/schema/xsd</schemaDirectory>
                        <schemaFiles>factura_v1.1.0.xsd</schemaFiles>
                    </configuration> 
                </execution> 
                <execution>
                    <id>generate-sri-autorizacion-comprobantes</id>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>xjc</goal> 
                    </goals> 
                    <configuration> 
                        <outputDirectory>target/generated-sources/sri/autorizacion</outputDirectory>
                        <packageName>${commonsource.packageName}.autorizacion</packageName>
                        <wsdl>true</wsdl>
                        <xmlschema>false</xmlschema>
                        <schemaDirectory>src/main/resources/schema/wsdl</schemaDirectory>
                        <schemaFiles>AutorizacionComprobantes.wsdl</schemaFiles>
                    </configuration> 
                </execution> 
            </executions> 
        </plugin> 
我创建了一个 xsd 和一个 wsdl 文件夹来分离配置。

6
您可以在配置文件中使用以下代码:
              <configuration>
                    <!-- Package to store the generated file -->
                    <packageName>com.example.demo.wsdl</packageName>
                    <!-- Treat the input as WSDL -->
                    <wsdl>true</wsdl>
                    <!-- Input is not XML schema -->
                    <xmlschema>false</xmlschema>
                    <!-- The WSDL file that you saved earlier -->
                    <schemaFiles>horarios.wsdl</schemaFiles>
                    <!-- The location of the WSDL file -->
                    <schemaDirectory>${project.basedir}/src/main/resources</schemaDirectory>
                    <!-- The output directory to store the generated Java files -->
                    <outputDirectory>${project.basedir}/src/main/java</outputDirectory>
                    <!-- Don't clear output directory on each run -->
                    <clearOutputDir>false</clearOutputDir>
                </configuration>

4

我已经尝试过使用jaxb2-maven-plugin生成Java文件。

<plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>jaxb2-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>xjc</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <schemaDirectory>src/main/webapp/schemas/</schemaDirectory>
                    <wsdl>true</wsdl>
                    <outputDirectory>src/main/java</outputDirectory>
                </configuration>
            </plugin>

运行此命令时,我使用了以下命令:

mvn jaxb2:xjc

试试这个,它会在你的src文件夹中生成jaxb类。希望这正是你所需要的。


1

对于版本2.5,配置应该如下:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>jaxb2-maven-plugin</artifactId>
    <version>2.5.0</version>
    <executions>
        <execution>
            <id>xjc</id>
            <phase>generate-sources</phase>
            <goals>
                <goal>xjc</goal>
            </goals>
            <configuration>
                <outputDirectory>${project.basedir}/src/main/java</outputDirectory>
                <packageName>com.packagename</packageName>
                <sources>
                    <source>${project.basedir}/src/main/resources/wsdl</source>
                </sources>
                <sourceType>wsdl</sourceType>
                <clearOutputDir>false</clearOutputDir>
                <noPackageLevelAnnotations>true</noPackageLevelAnnotations>
            </configuration>
        </execution>
    </executions>
</plugin>

0
  1. 在生成SOAP客户端(Jakarta命名空间)时,使用插件com.sun.xml.ws:jaxws-maven-plugin:4.0.2的wsimport目标。
  2. 非常重要的依赖项com.sun.xml.ws:jaxws-ri:4.0.2类型为pom。

<plugin> <groupId>com.sun.xml.ws</groupId> <artifactId>jaxws-maven-plugin</artifactId> <version>${jaxws.maven.plugin.version}</version> <executions> <execution> <id>soap-client</id> <goals> <goal>wsimport</goal> </goals> <configuration> <wsdlUrls> <wsdlUrl>${wsdl.url}</wsdlUrl> </wsdlUrls> <packageName>xx.xx.client</packageName> <sourceDestDir>${basedir}/src/main/java/</sourceDestDir> </configuration> </execution> </executions> </plugin> - undefined

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