maven-jaxb2-plugin在同一个项目中重用公共XSD
我有一个项目,它有一个模式A和B,都在同一个命名空间内。 两个导入模式C也使用相同的命名空间。 如何为A和B生成JAXB类以分离包,同时将生成的C中的JAXB类重用到commons包中?
我已经知道我应该使用剧集并使用为模式C生成的剧集作为模式A和B的单独执行的绑定文件。问题是我不知道如何引用这个生成的剧集文件。
这是一个例子:
org.jvnet.jaxb2.maven2 maven-jaxb2-plugin 0.12.3 generate-sources-C generate com.mymodel.commons ${project.build.directory}/generated-sources/xjc-commons src/main/resources/xsd/mymodel/c.xsd generate-sources-A generate com.mymodel.a src/main/resources/xsd/mymodel/a.xsd generate-sources-B generate com.mymodel.b src/main/resources/xsd/mymodel/b.xsd
这会导致在下面创建一个剧集文件:
target/generated-sources/xjc-commons/META-INF/sun-jaxb.episode
如何在A和B的执行中引用此剧集/绑定文件? 使用Episodes只提到如何从其他jar依赖项中引用一个剧集文件(或者我只是不能正确理解它,这更有可能)。
我已经看到一个较旧的答案建议将它作为参数-b
传递给XJC,但这似乎对我没有任何作用。 我仍然最终生成了三次与C相同的类。
免责声明:我是maven-jaxb2-plugin的作者 。
TL; DR这是一个测试项目 ,演示如何执行此操作。
这是可能的,但有点毛茸茸,所以请耐心等待。
如果a.xsd
, b.xsd
和c.xsd
在同一名称空间中,则a.xsd
和b.xsd
无法导入 c.xsd
,它们只能包含它。 我们想要将每个XSD生成到它自己的包中,比如test.a
, test.b
和test.c
,并在同一个Maven项目中完成。
为此,我们需要三个单独执行的maven-jaxb2-plugin
,每个maven-jaxb2-plugin
都配置有自己的架构和目标包。 例如:
org.jvnet.jaxb2.maven2 maven-jaxb2-plugin xjc-a generate test.a ${project.build.directory}/xjc-a a.xsd
为不同的执行使用不同的目标目录很重要 。
好的,这将创建三个具有三个目标包的目标目录。 接下来的问题是c.xsd
中的类将在test.a
和test.b
生成,我们要避免这些类。
为了实现这一点,我们必须告诉XJC使用test.c
中的类来c.xsd
类型。 这实际上是剧集文件的用途。 此文件通常在META-INF\sun-jaxb.episode
下生成,它包含已处理模式中所有类型的绑定。 这是为c.xsd
生成的c.xsd
:
剧集文件实际上是一个普通的绑定文件。 所以你可以直接在编译中使用它:
xjc-a generate test.a ${project.build.directory}/xjc-a a.xsd ${project.build.directory}/xjc-c/META-INF sun-jaxb.episode
只留下一个小问题。 XJC生成的剧集文件也包含此片段:
它实际上说“不要为给定命名空间中的模式生成代码”。 如果a.xsd
或b.xsd
位于不同的命名空间中,这不会成为问题。 但由于它们位于相同的命名空间中,因此该片段将有效地关闭a.xsd
或b.xsd
所有代码生成。
为了解决这个问题,我们可以对为c.xsd
生成的sun-jaxb.episode
进行后c.xsd
。 这可以通过简单的XSLT完成:
此c.xsd
应在c.xsd
的代码之后运行,但在生成a.xsd
和b.xsd
的代码之前。 这可以通过将这些执行放入不同的阶段( generate-sources
, process-sources
, generate-resources
)来实现。
下面是完整的pom.xml
:
4.0.0 org.jvnet.jaxb2.maven2 divide 0.0.1-SNAPSHOT org.glassfish.jaxb jaxb-runtime 2.2.11 junit junit test 4.12 org.codehaus.mojo xml-maven-plugin 1.0.2 transform process-sources ${project.build.directory}/xjc-c/META-INF ${project.build.directory}/xjc-c/META-INF sun-jaxb.episode src/main/xslt/removeJaxbSchemaBindings.xslt org.jvnet.jaxb2.maven2 maven-jaxb2-plugin 0.13.3 xjc-c generate generate-sources test.c ${project.build.directory}/xjc-c c.xsd xjc-a generate generate-resources test.a ${project.build.directory}/xjc-a a.xsd ${project.build.directory}/xjc-c/META-INF sun-jaxb.episode xjc-b generate generate-resources test.b ${project.build.directory}/xjc-b b.xsd ${project.build.directory}/xjc-c/META-INF sun-jaxb.episode