如何告诉jaxb/Maven生成多个架构包?

M.R*_*.R. 73 java schema xsd maven-2 jaxb

例:

</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>
Run Code Online (Sandbox Code Playgroud)

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

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

Pas*_*ent 110

我必须指定不同的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>
Run Code Online (Sandbox Code Playgroud)

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

$ 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

这似乎是预期的结果.

  • eclipse 插件 m2eclipse 会更新构建路径。使用 mvc clean assembly:assembly 生成 bean 后,我只需运行 [右键单击项目] &gt; [Maven] &gt; [更新项目配置] 并更新构建路径。 (2认同)

xme*_*eko 13

您还可以使用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>
Run Code Online (Sandbox Code Playgroud)

然后只需使用新的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>
Run Code Online (Sandbox Code Playgroud)

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

  • 这对我来说是最好的答案,因为每次添加新架构时我都不想继续更改pom. (2认同)

khm*_*ise 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>
Run Code Online (Sandbox Code Playgroud)

在我看来,你正在对抗maven的单一神器规则......可能你应该考虑这个.


Dav*_*nni 5

我已经解决了:

                        <removeOldOutput>false</removeOldOutput>
                        <clearOutputDir>false</clearOutputDir>
                        <forceRegenerate>true</forceRegenerate>
Run Code Online (Sandbox Code Playgroud)

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

  • 你也可以只将它添加到 `&lt;executions&gt;` 标签。这就够了。`&lt;removeOldOutput&gt;` 默认设置为 false。但我在 http://static.highsource.org/mjiip/maven-jaxb2-plugin/generate-mojo.html 找不到 `&lt;clearOutputDir&gt;` (2认同)

Pra*_*edi 5

这也可以通过为模式指定陈旧文件名而不清除输出目录来实现。默认输出目录自动包含在类路径中,这不太方便。如果我们指定不同的输出目录,则必须注意类路径才能在 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>
Run Code Online (Sandbox Code Playgroud)

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