我正在使用maven jaxb2插件生成Java类,这些类是从jar中的模式构建的。但是,我不知道如何从绑定文件中正确定位到这些模式。如果我从jar中提取模式,并将它们与绑定放在同一目录中,一切都会好起来。然而,这并不是一个切实可行的长期解决方案。
pom.xml:
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<version>0.8.1</version>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<configuration>
<schemas>
<schema>
<dependencyResource>
<groupId>com.test</groupId>
<artifactId>schemas</artifactId>
<version>1.10-SNAPSHOT</version>
<resource>schemas/schema.xsd</resource>
</dependencyResource>
</schema>
</schemas>
<bindingDirectory>bindings</bindingDirectory>
<generatePackage>test.package</generatePackage>
<bindingIncludes>
<include>*.xml</include>
</bindingIncludes>
<extension>true</extension>
</configuration>
</plugin>
bindings.xml:
<jxb:bindings xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
xsi:schemaLocation="http://java.sun.com/xml/ns/jaxb ./bindingschema_2_1.xsd"
version="2.1">
<jxb:bindings schemaLocation="classpath:/schemas/schema.xsd" node="/xs:schema">
<jxb:bindings node="//xs:complexType[@name='AbstractChangeable']">
<jxb:class implClass="com.test.AbstractEntity" />
</jxb:bindings>
</jxb:bindings>
您需要使用maven-dependency-plugin:unpack
,然后将maven-jaxb2-plugin
指向outputDirectory
。在这种情况下,在绑定文件中,您需要说出类似schemaLocation="../target/schemas/schema.xsd"
的内容
我想在这里工作的是:
<jaxb:bindings schemaLocation="maven:org.jvnet.jaxb2.maven2:maven-jaxb2-plugin-tests-po!/purchaseorder.xsd" node="/xs:schema">
<jaxb:schemaBindings>
<jaxb:package name="org.jvnet.jaxb2.maven2.tests.po"/>
</jaxb:schemaBindings>
</jaxb:bindings>
但目前没有。请提交一个问题,我会尽力解决。
现在有效的是基于SCD的绑定:
<jaxb:bindings scd="x-schema::po" xmlns:po="urn:po">
<jaxb:schemaBindings>
<jaxb:package name="org.jvnet.jaxb2.maven2.tests.po"/>
</jaxb:schemaBindings>
</jaxb:bindings>
因此,您实际上不需要基于特定的模式位置进行绑定,您可以基于命名空间URI进行绑定,这在理论上更好。
实际上,我有一个经验,SCD绑定并不总是可靠地工作。
更新
有关JAXB中SCD使用的更多信息,请参阅此链接。
我知道这是一个老问题,但我一直在努力解决同样的问题。我发现进行内联绑定可以解决这个问题。您将不再需要绑定文件,绑定将根据它转移到项目中。