2012-02-29 14 views
5

Uso il plugin maven jaxb2 per generare classi Java, create da schemi in un jar. Tuttavia, non sono sicuro di come localizzare correttamente questi schemi da un file di bind. Se estrai gli schemi dal jar e li rilasci nella stessa directory dei binding, tutto va bene. Tuttavia, questa non è una soluzione pratica a lungo termine.JAXB Collegamenti a schemi in un 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> 

risposta

5

Quello che mi piacerebbe avere lavorare qui è qualcosa di simile:

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

Ma non al momento. Per favore, file an issue, proverò a risolverlo.

cosa funziona oggi è basata sul SCD vincolante:

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

Quindi in realtà non hanno bisogno di impegnare sulla base di una posizione specifica dello schema, è possibile associare in base allo spazio dei nomi URI, che è teoricamente meglio .

Praticamente ho un'esperienza che le associazioni SCD non funzionano sempre in modo affidabile.

UPDATE

Vedi this link Per ulteriori informazioni sull'utilizzo SCD in JAXB.

+0

Non sono veramente sicuro di come usare questa tecnica di collegamento SCB per fare riferimento a schemi all'interno di un vaso di dipendenza fornito da Maven, ci sono esempi? – user1234057

+0

Ho pubblicato l'esempio sopra. Devi specificare il prefisso dello spazio dei nomi ('xmlns: po =" urn: po "') e usare questo prefisso nell'espressione scd ('scd =" x-schema :: po "significa" indirizzare lo schema con lo spazio dei nomi di destinazione dal prefisso 'po'"). Vedi questo link: http://jaxb.java.net/guide/Using_SCD_for_customizations.html – lexicore

+0

Non abbiamo davvero capito come fare riferimento a un vaso di esperti con quel metodo, ma aspetteremo che il plugin venga aggiornato. Grazie per l'aiuto! – user1234057

6

È necessario utilizzare maven-dependency-plugin:unpack e poi puntare maven-jaxb2-plugin-outputDirectory. In questo caso nel file di collegamento è necessario dire qualcosa come schemaLocation="../target/schemas/schema.xsd"

+1

Ho già utilizzato quel tipo di soluzione, come già detto, ma mi piacerebbe sapere come fare riferimento agli schemi all'interno di un jar. – user1234057

-2

So che questa è una vecchia domanda ma stavo lottando con lo stesso problema. Ho scoperto che fare legami in linea avrebbe risolto il problema. Non avresti più bisogno del file di bind e i binding verrebbero trasferiti su progetti che dipendono da esso.

+0

La tua risposta sarebbe molto meglio con un esempio di codice. – gknicker