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时,您不需要更改Mavenpom.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