如何告诉jaxb / Maven生成多个模式包?


80

例:

</plugin>       
       <plugin>
           <groupId>org.jvnet.jaxb2.maven2</groupId>
           <artifactId>maven-jaxb2-plugin</artifactId>
           <version>0.7.1</version>
           <executions>
             <execution>
               <goals>
                 <goal>generate</goal>
               </goals>
             </execution>
           </executions>
            <configuration>
             <schemaDirectory>src/main/resources/dir1</schemaDirectory>
              <schemaIncludes>
                  <include>schema1.xsd</include>
              </schemaIncludes>
              <generatePackage>schema1.package</generatePackage>
           </configuration>
         </plugin>
          <plugin>
           <groupId>org.jvnet.jaxb2.maven2</groupId>
           <artifactId>maven-jaxb2-plugin</artifactId>
           <version>0.7.1</version>
           <executions>
             <execution>
               <goals>
                 <goal>generate</goal>
               </goals>
             </execution>
           </executions>
            <configuration>
             <schemaDirectory>src/main/resources/dir2</schemaDirectory>
              <schemaIncludes>
                  <include>schema2.xsd</include>
              </schemaIncludes>
              <generatePackage>schema2.package</generatePackage>
           </configuration>
         </plugin>
       </plugins>

发生了什么:Maven执行了第一个插件。然后删除目标文件夹并创建第二个程序包,该程序包随后将可见。

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


是的,尽管Pascal的解决方案接近完美,但这里也遇到了同样的问题。现在我需要做的就是让IDE更好地与生成的代码一起玩,否则就是我想要的。
Newtopian

Answers:


118

我必须指定其他值generateDirectory(没有这个,插件将考虑文件是最新的,并且在第二次执行期间不生成任何东西)。并且我建议target/generated-sources/<tool>对生成的源遵循约定,以便将其自动导入您喜欢的IDE中。我还建议声明多个execution声明,而不是两次声明插件(并configuration在每个execution元素内部移动):

<plugin>
  <groupId>org.jvnet.jaxb2.maven2</groupId>
  <artifactId>maven-jaxb2-plugin</artifactId>
  <version>0.7.1</version>
  <executions>
    <execution>
      <id>schema1-generate</id>
      <goals>
        <goal>generate</goal>
      </goals>
      <configuration>
        <schemaDirectory>src/main/resources/dir1</schemaDirectory>
        <schemaIncludes>
          <include>shiporder.xsd</include>
        </schemaIncludes>
        <generatePackage>com.stackoverflow.package1</generatePackage>
        <generateDirectory>${project.build.directory}/generated-sources/xjc1</generateDirectory>
      </configuration>
    </execution>
    <execution>
      <id>schema2-generate</id>
      <goals>
        <goal>generate</goal>
      </goals>
      <configuration>
        <schemaDirectory>src/main/resources/dir2</schemaDirectory>
        <schemaIncludes>
          <include>books.xsd</include>
        </schemaIncludes>
        <generatePackage>com.stackoverflow.package2</generatePackage>
        <generateDirectory>${project.build.directory}/generated-sources/xjc2</generateDirectory>
      </configuration>
    </execution>
  </executions>
</plugin>

通过此设置,我得到了以下结果 mvn clean compile

$树目标/
目标/
├──班
│├──com
││└──stackoverflow
││├──App.class
││├──套餐1
│││├──ObjectFactory.class
│││├──Shiporder.class
│││├──Shiporder $ Item.class
│││└──Shiporder $ Shipto.class
││└──package2
││├──BookForm.class
││├──BooksForm.class
││├──ObjectFactory.class
││└──package-info.class
│├──目录1
││└──shiporder.xsd
│└──dir2
│└──books.xsd
└──生成源
    ├──xjc
    │└──META-INF
    │└──sun-jaxb.episode
    ├──xjc1
    │└──com
    │└──stackoverflow
    │└──套餐1
    │├──ObjectFactory.java
    │└──Shiporder.java
    └──xjc2
        └──com
            └──stackoverflow
                └──套餐2
                    ├──BookForm.java
                    ├──BooksForm.java
                    ├──ObjectFactory.java
                    └──package-info.java

这似乎是预期的结果。


谢谢,昨天我实际上也遇到了同样的问题,但暂时不予理op。您的解决方案几乎可以完美运行,现在我唯一的问题是我无法使Eclipse正确编译。虽然在命令行上一切都很好。我当前的解决方法是,我将目标文件夹中的这些文件夹声明为源文件夹,并且一切都很好。.尽管我不确定我是否很喜欢,但我宁愿使用生成的代码创建一个jar并直接使用它
Newtopian

1
eclipse插件m2eclipse确实更新了构建路径。用mvc clean assembly:assembly生成bean之后,我只需运行[右键单击项目]> [Maven]> [Update Project Configuration],它会更新构建路径。
MR 2010年

@Newtopian请参阅@MR的评论,如果您遵循我提到的约定,m2eclipse将为您完成此任务。
Pascal Thivent,2010年

好的,事实证明,该操作与我手动执行的操作相同,只是现在只需单击一两次即可。在源文件夹中看到目标仍然很奇怪,但是现在几乎可以免费使用了,所以我将其保留:-)
Newtopian 2010年

1
我知道这是个老问题,但我希望有什么可以回答我。我使用该代码,它可以工作。但是,当我要设置相同的程序包时,它总是只生成一个模式。例如,在第一次执行中,我设置了com.myproject.answer,在第二次执行中,设置了com.myproject.request ..,在生成源之后,我只有* answer包和请求丢失了...知道如何解决它吗?生成目录我设置也一样。
丹尼斯·斯蒂芬诺夫

14

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

<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" version="2.0" schemaLocation="book.xsd">

    <jaxb:globalBindings>
        <xjc:serializable uid="1" />
    </jaxb:globalBindings>

    <jaxb:schemaBindings>
        <jaxb:package name="com.stackoverflow.book" />
    </jaxb:schemaBindings>

</jaxb:bindings>

然后只需使用新的maven-jaxb2-plugin 0.8.0<schemas>和中的<bindings>元素pom.xml。或在指定上最目录<schemaDirectory>,并<bindingDirectory><include>你的架构和绑定:

<schemaDirectory>src/main/resources/xsd</schemaDirectory>
<schemaIncludes>
    <include>book/*.xsd</include>
    <include>person/*.xsd</include>
</schemaIncludes>
<bindingDirectory>src/main/resources</bindingDirectory>
<bindingIncludes>
    <include>book/*.xjb</include>
    <include>person/*.xjb</include>
</bindingIncludes>

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


尽管提供语法高亮提示的微不足道的修改确实提高了帖子的可读性
Kev 2012年

好的,谢谢您的解释。我没有得到该编辑添加了语法突出显示。
xmedeko 2012年

2
这是对我最好的答案,因为我不想每次添加新模式时都不断更改pom。
本·瑟利

这里的一个问题是book和person是否位于xsd中的同一目标名称空间中。假设他们拥有书籍,期刊,报纸等。所有这些都包括publishable.xsd。它们必须位于与可发布对象相同的名称空间中,并且因此必须位于同一名称空间中,现在这又中断了,因为每个名称空间只能有一个schemaBindings。我同意这是理想的,但我希望它适用于上面的示例,但是JAXB不够灵活。
6

8

您应该将其更改为仅定义一次插件,然后执行两次执行区域...如下所示...并且应该设置generateDirectory(基于文档)。

<plugin>
  <groupId>org.jvnet.jaxb2.maven2</groupId>
  <artifactId>maven-jaxb2-plugin</artifactId>
  <version>0.7.1</version>
  <executions>
    <execution>
      <id>firstrun</id>
      <goals>
        <goal>generate</goal>
      </goals>
      <configuration>
        <generateDirectory>target/gen1</generateDirectory>
        <schemaDirectory>src/main/resources/dir1</schemaDirectory>
        <schemaIncludes>
          <include>schema1.xsd</include>
        </schemaIncludes>
        <generatePackage>schema1.package</generatePackage>
      </configuration>
    </execution>
    <execution>
      <id>secondrun</id>
      <goals>
        <goal>generate</goal>
      </goals>
      <configuration>
        <generateDirectory>target/gen2</generateDirectory>
        <schemaDirectory>src/main/resources/dir2</schemaDirectory>
        <schemaIncludes>
          <include>schema2.xsd</include>
        </schemaIncludes>
        <generatePackage>schema2.package</generatePackage>
      </configuration>
    </execution>
  </executions>
</plugin>

在我看来,您正在与Maven的单一工件规则作斗争...也许您应该考虑一下。


每个模块一个工件规则是正确的,但是... OP不会生成两个工件。
Pascal Thivent 2010年

5

这也可以通过为架构指定陈旧的文件名而不清除输出目录来实现。默认的输出目录自动包含在classpath中,这不太方便。如果我们指定不同的输出目录,则必须照顾类路径才能在IDE中使用此代码。例如 -

<plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>jaxb2-maven-plugin</artifactId>
            <version>1.3.1</version>
            <configuration>
                <quiet>true</quiet>
                <verbose>false</verbose>
                <clearOutputDir>false</clearOutputDir>
                <readOnly>true</readOnly>
                <arguments>-mark-generated</arguments>
            </configuration>
            <executions>
                <execution>
                    <id>reportingSchema</id>
                    <goals>
                        <goal>xjc</goal>
                    </goals>
                    <configuration>
                        <schemaDirectory>src/main/resources/schema/r17/schemaReporting</schemaDirectory>
                        <schemaIncludes>
                            <include>OCISchemaReporting.xsd</include>
                        </schemaIncludes>
                        <packageName>com.broadsoft.oci.r17.reporting</packageName>
                        <staleFile>${build.directory}/generated-sources/.jaxb-staleFlag-reporting</staleFile>
                    </configuration>
                </execution>
                <execution>
                    <id>schemaAS</id>
                    <goals>
                        <goal>xjc</goal>
                    </goals>
                    <configuration>
                        <schemaDirectory>src/main/resources/schema/r17/schemaAS</schemaDirectory>
                        <schemaIncludes>
                            <include>OCISchemaAS.xsd</include>
                        </schemaIncludes>
                        <packageName>com.broadsoft.oci.r17.as</packageName>
                        <staleFile>${build.directory}/generated-sources/.jaxb-staleFlag-as</staleFile>
                    </configuration>
                </execution>
            </executions>
        </plugin>
</plugins>

来源:使用JAXB插件生成代码


5

我已经解决了:

                        <removeOldOutput>false</removeOldOutput>
                        <clearOutputDir>false</clearOutputDir>
                        <forceRegenerate>true</forceRegenerate>

将此添加到每个配置;)


2
您也可以仅将其添加到<executions>标签中。足够了。<removeOldOutput>默认情况下设置为false。但我不能找到<clearOutputDir>static.highsource.org/mjiip/maven-jaxb2-plugin/...

对我而言,真正的解决方案是,您可以在同一文件夹中生成Everythong
MilacH

<clearOutputDir>false</clearOutputDir>就我而言就足够了。
Ruwanka Madhushan

3

该问题已在插件的1.6版中修复

            <groupId>org.codehaus.mojo</groupId>
            <artifactId>jaxb2-maven-plugin</artifactId>
            <version>1.6</version>

快速提醒一下,我注意到第一次迭代输出已被删除。我通过在每个执行中添加以下内容来修复它。

                        <removeOldOutput>false</removeOldOutput>
                        <clearOutputDir>false</clearOutputDir>

这是我完整的工作示例,每个迭代正确输出。顺便说一句,由于xsd的名称空间重复,我不得不这样做。这似乎解决了我的问题。

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

2

经过多次试用,以下对我有用

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

2

在Maven中使用jaxb时遇到了很多问题,但是我通过执行以下操作设法解决了您的问题

首先创建一个schema.xjc文件

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

包名称可以是您想要的任何名称,只要它在Java中不包含任何保留关键字即可

接下来,您必须创建wsimport.bat脚本以在首选位置生成打包的代码。

cd C:\YOUR\PATH\TO\PLACE\THE\PACKAGES
wsimport -keep -verbose -b "C:\YOUR\PATH\TO\schema.xjb" YOUR_URL?wsdl
pause

如果不想使用cd,可以将wsimport.bat放在“ C:\ YOUR \ PATH \ TO \ PLACE \ THE \ PACKAGES”中

如果不使用-keep -verbose来运行它,它将仅生成软件包,而不生成.java文件。

-b将确保生成时使用schema.xjc


0

有另一个解决方案,这是一个清晰的(IMO)解决方案。有一个名为“ staleFile”的参数,该参数用作不再生成内容的标志。只需在每次执行中更改它即可。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.