Maven 2 如何让jaxb/Maven生成多个模式包?

Maven 2 如何让jaxb/Maven生成多个模式包?,maven-2,jaxb,schema,xsd,java,Maven 2,Jaxb,Schema,Xsd,Java,例如: org.jvnet.jaxb2.maven2 maven-jaxb2-plugin 0.7.1 生成 src/main/resources/dir1 schema1.xsd 方案1.1包 org.jvnet.jaxb2.maven2 maven-jaxb2-plugin 0.7.1 生成 src/main/resources/dir2 schema2.xsd 方案2.2包 发生了什么: Maven执行第一个插件。然后删除目标文件夹并创建第二个包,然后该包可见 我试图为第一个配置设置t

例如:


org.jvnet.jaxb2.maven2
maven-jaxb2-plugin
0.7.1
生成
src/main/resources/dir1
schema1.xsd
方案1.1包
org.jvnet.jaxb2.maven2
maven-jaxb2-plugin
0.7.1
生成
src/main/resources/dir2
schema2.xsd
方案2.2包
发生了什么: Maven执行第一个插件。然后删除目标文件夹并创建第二个包,然后该包可见


我试图为第一个配置设置target/somedir1,为第二个配置设置target/somedir2。但是行为没有改变吗?有什么想法吗?我不想直接在src/main/java文件夹中生成包,因为这些包是生成的,不应该与手动创建的类混合使用。

您应该更改它,只定义插件一次,执行两次执行区域…如下所示…并且应该设置generateDirectory(基于文档)


org.jvnet.jaxb2.maven2
maven-jaxb2-plugin
0.7.1
首轮
生成
目标/第1代
src/main/resources/dir1
schema1.xsd
方案1.1包
第二轮
生成
目标/第2代
src/main/resources/dir2
schema2.xsd
方案2.2包

在我看来,你正在与maven的单一工件规则作斗争……也许你应该考虑一下这一点。

我必须指定不同的规则(没有这一点,插件认为文件是最新的,在第二次执行期间不会生成任何内容)。我建议对生成的源代码遵循
target/generated sources/
惯例,这样它们就会自动导入到您喜爱的IDE中。我还建议声明几个
执行
,而不是两次声明插件(并在每个
执行
元素中移动
配置
):


org.jvnet.jaxb2.maven2
maven-jaxb2-plugin
0.7.1
方案1生成
生成
src/main/resources/dir1
shiporder.xsd
com.stackoverflow.package1
${project.build.directory}/generated sources/xjc1
方案2生成
生成
src/main/resources/dir2
books.xsd
com.stackoverflow.package2
${project.build.directory}/generated sources/xjc2
通过此设置,我在执行
mvn干净编译后得到以下结果

$ tree target/ target/ ├── classes │   ├── com │   │   └── stackoverflow │   │   ├── App.class │   │   ├── package1 │   │   │   ├── ObjectFactory.class │   │   │   ├── Shiporder.class │   │   │   ├── Shiporder$Item.class │   │   │   └── Shiporder$Shipto.class │   │   └── package2 │   │   ├── BookForm.class │   │   ├── BooksForm.class │   │   ├── ObjectFactory.class │   │   └── package-info.class │   ├── dir1 │   │   └── shiporder.xsd │   └── dir2 │   └── books.xsd └── generated-sources ├── xjc │   └── META-INF │   └── sun-jaxb.episode ├── xjc1 │   └── com │   └── stackoverflow │   └── package1 │   ├── ObjectFactory.java │   └── Shiporder.java └── xjc2 └── com └── stackoverflow └── package2 ├── BookForm.java ├── BooksForm.java ├── ObjectFactory.java └── package-info.java $tree目标/ 目标/ ├── 班级 │   ├── 通用域名格式 │   │   └── 栈溢出 │   │   ├── 应用程序类 │   │   ├── 包装1 │   │   │   ├── ObjectFactory.class │   │   │   ├── 舱位 │   │   │   ├── Shiporder$Item.class │   │   │   └── Shiporder$Shipto.class │   │   └── 包装2 │   │   ├── 书单 │   │   ├── 图书格式类 │   │   ├── ObjectFactory.class │   │   └── package-info.class │   ├── dir1 │   │   └── shiporder.xsd │   └── dir2 │   └── books.xsd └── 生成源 ├── xjc │   └── META-INF │   └── sun-jaxb ├── xjc1 │   └── 通用域名格式 │   └── 栈溢出 │   └── 包装1 │   ├── ObjectFactory.java │   └── Shiporder.java └── xjc2 └── 通用域名格式 └── 栈溢出 └── 包装2 ├── BookForm.java ├── BooksForm.java ├── ObjectFactory.java └── package-info.java 这似乎是预期的结果。

我已经解决了以下问题:

false
假的
真的

将其添加到每个配置中;)

您还可以使用JAXB绑定为每个模式指定不同的包,例如


然后只需在
pom.xml
中使用新的maven-jaxb2-plugin 0.8.0
元素。或者在
中以及通过
您的架构和绑定指定最顶层的目录:

src/main/resources/xsd
book/*.xsd
person/*.xsd
src/main/resources
book/*.xjb
person/*.xjb

我认为这是一个更方便的解决方案,因为当您添加一个新的XSD时,您不需要更改Maven
pom.xml
,只需将一个新的XJB绑定文件添加到同一目录即可。

这也可以通过为模式指定过时的文件名而不清除输出目录来实现。默认的输出目录自动包含在类路径中,这很不方便。若我们指定不同的输出目录,那个么在IDE中使用该代码时必须考虑类路径。比如说-


org.codehaus.mojo

还有另一个,一个明确的解决方案(IMO)
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>jaxb2-maven-plugin</artifactId>
            <version>1.6</version>
                        <removeOldOutput>false</removeOldOutput>
                        <clearOutputDir>false</clearOutputDir>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>jaxb2-maven-plugin</artifactId>
            <version>1.6</version>
            <executions>
                <execution>
                    <id>submitOrderRequest</id>
                    <goals>
                        <goal>xjc</goal>
                    </goals>
                    <configuration>
                        <extension>true</extension>
                        <schemaDirectory>src/main/resources/xsd/</schemaDirectory>
                        <!-- <schemaFiles>getOrderStatusResponse.xsd,quoteShippingRequest.xsd,quoteShippingResponse.xsd,submitOrderRequest.xsd,submitOrderResponse.xsd</schemaFiles> -->
                        <schemaFiles>submitOrderRequest.xsd</schemaFiles>
                        <bindingDirectory>${project.basedir}/src/main/resources/xjb</bindingDirectory>
                        <bindingFiles>submitOrderRequest.xjb</bindingFiles>
                        <removeOldOutput>false</removeOldOutput>
                        <clearOutputDir>false</clearOutputDir>
                    </configuration>
                </execution>
                <execution>
                    <id>submitOrderResponse</id>
                    <goals>
                        <goal>xjc</goal>
                    </goals>
                    <configuration>
                        <extension>true</extension>
                        <schemaDirectory>src/main/resources/xsd/</schemaDirectory>
                        <!-- <schemaFiles>getOrderStatusResponse.xsd,quoteShippingRequest.xsd,quoteShippingResponse.xsd,submitOrderRequest.xsd,submitOrderResponse.xsd</schemaFiles> -->
                        <schemaFiles>submitOrderResponse.xsd</schemaFiles>
                        <bindingDirectory>${project.basedir}/src/main/resources/xjb</bindingDirectory>
                        <bindingFiles>submitOrderResponse.xjb</bindingFiles>
                        <removeOldOutput>false</removeOldOutput>
                        <clearOutputDir>false</clearOutputDir>
                    </configuration>
                </execution>
            </executions>

        </plugin>
<plugin>
         <groupId>org.codehaus.mojo</groupId>
         <artifactId>jaxb2-maven-plugin</artifactId>
         <version>2.1</version>
         <executions>
            <execution>
              <id>xjc1</id>
              <goals>
                  <goal>xjc</goal>
              </goals>
             <configuration>
                <packageName>com.mycompany.clientSummary</packageName>
               <sourceType>wsdl</sourceType>
                <sources>
                <source>src/main/resources/wsdl/GetClientSummary.wsdl</source>
                </sources>
                <outputDirectory>target/generated-sources/xjb</outputDirectory>
                 <clearOutputDir>false</clearOutputDir>
            </configuration>
          </execution>

          <execution>
             <id>xjc2</id>
             <goals>
                 <goal>xjc</goal>
             </goals>
             <configuration>
                <packageName>com.mycompany.wsclient.employerProfile</packageName>
                <sourceType>wsdl</sourceType>
                <sources>
                <source>src/main/resources/wsdl/GetEmployerProfile.wsdl</source>
                </sources>
                <outputDirectory>target/generated-sources/xjb</outputDirectory>
                <clearOutputDir>false</clearOutputDir>
         </configuration>
         </execution>

         <execution>
            <id>xjc3</id>
            <goals>
                <goal>xjc</goal>
            </goals>
            <configuration>
                <packageName>com.mycompany.wsclient.producersLicenseData</packageName>
                <sourceType>wsdl</sourceType>
                <sources>
                <source>src/main/resources/wsdl/GetProducersLicenseData.wsdl</source>
                </sources>
                <outputDirectory>target/generated-sources/xjb</outputDirectory>
                <clearOutputDir>false</clearOutputDir>
            </configuration>
        </execution>


     </executions>
  </plugin>
<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
               xmlns:xsd="http://www.w3.org/2001/XMLSchema"
               jaxb:version="2.0">
    <jaxb:bindings schemaLocation="YOUR_URL?wsdl#types?schema1">
        <jaxb:schemaBindings>
            <jaxb:package name="your.package.name.schema1"/>
        </jaxb:schemaBindings>
    </jaxb:bindings>
    <jaxb:bindings schemaLocation="YOUR_URL??wsdl#types?schema2">
        <jaxb:schemaBindings>
            <jaxb:package name="your.package.name.schema2"/>
        </jaxb:schemaBindings>
    </jaxb:bindings>
</jaxb:bindings>
cd C:\YOUR\PATH\TO\PLACE\THE\PACKAGES
wsimport -keep -verbose -b "C:\YOUR\PATH\TO\schema.xjb" YOUR_URL?wsdl
pause