我有两个模式A,B。我重复使用B中的一些A元素。
我不使用名称空间。
我正在使用
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<version>0.9.0</version>
我已经在架构B中定义了架构A的包含:
<xs:include schemaLocation="classpath:my.schema.A.xsd"/>
和目录
REWRITE_SYSTEM "classpath:my.schema.A.xsd" "maven:my.schema:schema-a!/A.xsd"
jaxb配置:
<configuration>
<generatePackage>my.schema.b</generatePackage>
<schemaIncludes>
<includes>B.xsd</includes>
</schemaIncludes>
<episodes>
<episode>
<groupId>my.schema</groupId>
<artifactId>schema-a</artifactId>
</episode>
</episodes>
<catalog>src/main/catalog/catalog.cat</catalog>
</configuration>
问题在于,无论何时指定episode依赖项,架构都不会生成任何类,即使它包含一些我想为其生成类的B元素。
[INFO] Parsing input schema(s)...
[INFO] Compiling input schema(s)...
[INFO] Cleaning package directories.
[INFO] Finished execution.
当我删除这一集时,它运作良好,并为模式A生成类 - 我确实想避免这些。
你有什么建议吗?
答案 0 :(得分:5)
好的,我已经检查了你的例子。问题是你没有使用命名空间。
检查您的META-INF/sub-jaxb.episode
文件:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<jaxb:bindings version="2.1" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb">
<jaxb:bindings scd="x-schema::">
<jaxb:schemaBindings map="false">
<jaxb:package name="schema.episode.a"/>
</jaxb:schemaBindings>
<jaxb:bindings scd="person">
<jaxb:class ref="schema.episode.a.Person"/>
</jaxb:bindings>
</jaxb:bindings>
</jaxb:bindings>
您会看到<jaxb:bindings scd="x-schema::">
,然后是<jaxb:schemaBindings map="false">
。这基本上告诉XJC&#34;不要在空命名空间中映射任何东西&#34;。由于您的第二个架构(b.xsd
)也不使用命名空间,因此当您使用a.xsd
的剧集文件(上面的绑定)时,您也会禁止为b.xsd
生成代码
总而言之,在使用剧集/单独的架构编译时,您无法将具有一个命名空间的架构放入不同的剧集中。这正是include
的问题。
这不是maven-jaxb2-plugin
中的错误。我不会把它称为XJC中的错误。它是默认情况下剧集的工作方式。
请参阅我的拉取请求here,它会演示事件编译,相应地处理命名空间。
答案 1 :(得分:0)
此处maven-jaxb2-plugin
的作者。
我的猜测是你的剧集说的是“不要编译命名空间A和B&#34;”。请检查JAR中META-INF
内的绑定文件。
这是非常先进的用法,这可能会出现很多问题。你使用:
目录和剧集是XJC功能,Maven解析来自maven-jaxb2-plugin
。
我们应该尝试找出失败的原因:
maven:
maven:my.schema:schema-a!/A.xsd
作为没有剧集和目录的架构位置显然还有另外三种组合尝试。
如果您提供示例项目,我会调查(但不会在接下来的10天内)。最好的办法是提出问题。我将把插件移动到GitHub,所以这将是一个好地方: