2012-05-24 15 views
6

Próbuję wygenerować klasy Java z kilku konkretnych XSD z xjc. Schematy te mają pewne wspólne definicje, więc importują wiele popularnych XSD. W szczególności mogą zawierać od zera do wszystkich popularnych XSD.Definiowanie nazw pakietów dla typowych XSD z xjc i powiązań

Chciałbym wygenerować wszystkie klasy z określonego XSD do konkretnego pakietu, ale zachowując wygenerowane klasy dla wspólnych schematów w jednym pakiecie, aby nie były powtarzane dla każdego schematu w drzewie źródłowym .

Nauczyłem się, że niestandardowe powiązania mogą być użyte do określenia pakietów na podstawie na schemacie, z na przykład:

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

Mam następującą strukturę:

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 

to wszystko działa dobrze z:

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

to generuje zajęcia dla specific1.xsd w mypackage.specific1 i wspólnych klas w mypackage.commons. Ale gdy próbuję wygenerować klas dla specificN, xjc wyrzuca następujący błąd:

[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 

otrzymuję ten błąd powtarza się za każdym wspólnym XSD nie importowanego w każdym konkretnym XSD.

Czy istnieje sposób, w jaki mogę dokonać xjc zignorować powiązania w commonBindings.xjb, które nie są używane w XSD Generowania klas dla?

Albo, czy kieruję się w niewłaściwym kierunku za pomocą tego podejścia i czy powinienem na przykład stosować adnotacje w określonych xsd? Chciałbym, jeśli to możliwe, uniknąć modyfikacji schematów.

Odpowiedz

3

Uważam, że trzeba użyć odcinka JAXB. Zobacz this SO post, spójrz na odpowiedź @BlaiseDoughan pod warunkiem.

W twoim przypadku uruchom najpierw xjc, używając niestandardowego pliku powiązania, aby dostosować nazwę paczki, w stosunku do wszystkich popularnych XSD, do wygenerowania pliku epizodu i wspólnych klas Java.

Następnie użyj ponownie xjc, z innymi XSD, które chcesz, odnosząc plik odcinka od pierwszego uruchomienia.

Powiązane problemy