2012-05-24 7 views
6

Ich versuche Java-Klassen aus mehreren bestimmten XSDs mit xjc zu generieren. Diese Schemas haben einige gemeinsame Definitionen, so dass sie eine Anzahl gängiger XSDs importieren. Insbesondere können sie von Null bis zu allen gängigen XSDs enthalten.Definieren von Paketnamen für allgemeine XSDs mit xjc und Bindungen

Ich möchte alle Klassen von einer bestimmten XSD zu einem bestimmten Paket generieren, aber die generierten Klassen für die allgemeinen Schemas in einem gemeinsamen Paket behalten, damit sie nicht für jedes spezifische Schema in der Quellstruktur wiederholt werden .

Ich habe gelernt, dass benutzerdefinierte Bindungen verwendet werden können Pakete auf einer Pro-Schema Basis angeben, mit zum Beispiel:

<jxb:bindings schemaLocation="common1.xsd" node="/xsd:schema"> 
    <jxb:schemaBindings> 
     <jxb:package name="mypackage.commonclasses"/> 
    </jxb:schemaBindings> 
</jxb:bindings> 

ich die folgende Struktur haben:

schemas 
| - common 
| | - common1.xsd --> XSD with common types #1 
| | - ... 
| | - commonN.xsd --> XSD with common types #N 
| | - commonBindings.xjb --> Defines package "mypackage.commons" for common*.xsd 
| - specific1 
| | - specific1.xsd --> Includes ../common/common{1-N}.xsd 
| | - specific1.xjb --> Defines package "mypackage.specific1" for specific1.xsd 
| - specificN 
| | - specificN.xsd --> Includes only ../common/common1.xsd 
| | - specificN.xjb --> Defines package "mypackage.specificN" for specificN.xsd 

das alles funktioniert gut mit:

xjc -b schemas/specific1 
    -b schemas/common 
    schemas/specific1/specific1.xsd 

es erzeugt die Klassen für specific1.xsd in mypackage.specific1 und die gemeinsamen Klassen in mypackage.commons. Aber wenn ich versuche, für specificN die Klassen zu erzeugen, wirft xjc den folgenden Fehler:

[ERROR] "file:/drive/dir/schemas/common/common1.xsd" is not a part of 
this compilation. Is this a mistake for "/drive/dir/schemas/common/commonBindings.xjb"? 
    line 2 of file:/drive/dir/schemas/common/commonBindings.xjb 

ich diesen Fehler für jeden gemeinsamen XSD wiederholt bekommen nicht in einem bestimmten XSD importiert.

Gibt es eine Möglichkeit, dass ich xjc die Bindungen in commonBindings.xjb ignorieren kann, die nicht in der XSD verwendet werden, für die ich die Klassen erzeuge?

Oder ziele ich mit diesem Ansatz in die falsche Richtung und sollte zum Beispiel Anmerkungen im spezifischen xsd verwenden? Ich möchte vermeiden, die Schemas wenn möglich zu ändern.

Antwort

3

Ich denke, was Sie brauchen, ist die JAXB-Episode zu verwenden. Siehe this SO post, werfen Sie einen Blick auf die Antwort @BlaiseDoughan zur Verfügung gestellt.

In Ihrem Fall starten Sie zuerst xjc und verwenden Ihre benutzerdefinierte Bindungsdatei für die Anpassung des Paketnamens für alle gängigen XSDs, um eine Episodendatei und Ihre üblichen Java-Klassen zu generieren.

Verwenden Sie dann xjc erneut mit den anderen gewünschten XSDs, indem Sie auf die Episodendatei vom ersten Lauf verweisen.

Verwandte Themen