Używam wtyczki maven jaxb2 do generowania klas Java, zbudowanych ze schematów w słoiku. Jednak nie jestem pewien, jak poprawnie zlokalizować te schematy z pliku powiązań. Jeśli wyodrębnię schematy ze słoika i upuść je w tym samym katalogu, co powiązania, wszystko jest w porządku. Nie jest to jednak praktyczne rozwiązanie długoterminowe.

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>

Wiązania.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>
6
user1234057 1 marzec 2012, 01:10

3 odpowiedzi

Najlepsza odpowiedź

Chciałbym, żeby tutaj pracowało coś takiego:

<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>

Ale w tej chwili tak nie jest. Proszę zgłosić problem, postaram się go naprawić.

To, co teraz działa, to wiązanie oparte na 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>

Więc tak naprawdę nie musisz wiązać się na podstawie określonej lokalizacji schematu, możesz wiązać na podstawie identyfikatora URI przestrzeni nazw, co jest teoretycznie lepsze.

Praktycznie mam doświadczenie, że wiązania SCD nie zawsze działają niezawodnie.

AKTUALIZACJA

Zobacz ten link, aby uzyskać więcej informacji na temat użycia SCD w JAXB.

5
lexicore 2 marzec 2012, 03:39

Musisz użyć maven-dependency-plugin:unpack a następnie wskaż maven-jaxb2-plugin na outputDirectory. W takim przypadku w wiązaniu pliku musisz powiedzieć coś takiego jak schemaLocation="../target/schemas/schema.xsd"

6
dma_k 1 marzec 2012, 02:10

Wiem, że to stare pytanie, ale zmagałem się z tym samym problemem. Odkryłem, że robienie wiązań inline rozwiąże problem. Nie będziesz już potrzebował pliku powiązania, a powiązania zostaną przeniesione do projektów w zależności od niego.

-2
Rey Pader 14 maj 2014, 10:37