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.xsdb.xsdc.xsd在同一名称空间中,则a.xsdb.xsd无法导入 c.xsd ,它们只能包含它。 我们想要将每个XSD生成到它自己的包中,比如test.atest.btest.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.atest.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.xsdb.xsd位于不同的命名空间中,这不会成为问题。 但由于它们位于相同的命名空间中,因此该片段将有效地关闭a.xsdb.xsd所有代码生成。

为了解决这个问题,我们可以对为c.xsd生成的sun-jaxb.episode进行后c.xsd 。 这可以通过简单的XSLT完成:

          

c.xsd应在c.xsd的代码之后运行,但在生成a.xsdb.xsd的代码之前。 这可以通过将这些执行放入不同的阶段( generate-sourcesprocess-sourcesgenerate-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