2012-02-29 18 views
5

Używam wtyczki javenb2 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. Jednak nie jest to praktyczne rozwiązanie długoterminowe.Wiązania JAXB do schematów w 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> 

Odpowiedz

5

Co chciałbym mieć pracy tutaj jest 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 nie w tej chwili. Proszę file an issue, spróbuję to naprawić.

Co działa teraz jest wiążący na bazie 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 w rzeczywistości nie muszą wiązać na podstawie określonej lokalizacji schematu, można powiązać na podstawie nazw URI, który jest teoretycznie lepszy .

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

UPDATE

Zobacz this link więcej informacji SCD stosowania w JAXB.

+0

Nie jestem naprawdę pewien, jak użyć tej techniki wiązania SCB do odwoływania się do schematów wewnątrz sługi zależności dostarczonych przez maven, czy są przykłady? – user1234057

+0

Opublikowałem powyższy przykład. Musisz określić prefiks przestrzeni nazw ('xmlns: po =" urn: po "') i użyć tego przedrostka w wyrażeniu scd ('scd =" x-schema :: po "' znaczy "adres schematu z docelową przestrzenią nazw z przedrostka 'po'"). Zobacz ten link: http://jaxb.java.net/guide/Using_SCD_for_customizations.html – lexicore

+0

Nie bardzo wiemy, jak odwołać się do słoika z maven za pomocą tej metody, ale zaczekamy, aż wtyczka zostanie zaktualizowana. Dzięki za pomoc! – user1234057

6

Trzeba użyć maven-dependency-plugin:unpack a następnie wskaż maven-jaxb2-plugin do outputDirectory. W tym przypadku w wiązaniu pliku trzeba powiedzieć coś schemaLocation="../target/schemas/schema.xsd"

+1

Dostałem rozwiązanie tego typu działające, jak już wspomniano, ale chciałbym wiedzieć, jak odwoływać się do schematów wewnątrz słoika. – user1234057

-2

Wiem, że to stare pytanie, ale zmagałem się z tym samym problemem. Odkryłem, że wykonywanie wbudowanych wiązań rozwiązałoby problem. Użytkownik nie będzie już potrzebował pliku powiązania, a powiązania zostaną przeniesione do projektów zależnych od niego.

+0

Twoja odpowiedź będzie znacznie lepsza z przykładem kodu. – gknicker

Powiązane problemy