6

我正在使用 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>

绑定.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>
4

3 回答 3

6

您需要使用maven-dependency-plugin:unpack然后maven-jaxb2-plugin指向outputDirectory. 在这种情况下,在绑定文件中,您需要说类似schemaLocation="../target/schemas/schema.xsd"

于 2012-02-29T22:10:16.080 回答
5

我想在这里工作是这样的:

<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 使用的更多信息,请参阅此链接

于 2012-03-01T21:37:30.843 回答
-2

我知道这是一个老问题,但我一直在努力解决同样的问题。我发现做内联绑定可以解决这个问题。您将不再需要绑定文件,并且绑定将根据它转移到项目中。

于 2014-05-14T06:37:39.470 回答