JAXB – Creazione di moduli per il riutilizzo

JAXB supporta la generazione di codice modulare?

La maggior parte del mio background è con JibX per il marshalling XML, ma per motivi legacy la nostra azienda utilizza JAXB.

Una funzionalità disponibile per JIBX era la generazione di codice modulare . Diciamo che ho uno schema principale ma ho diversi inviluppi diversi per quello schema. Con JibX potevo creare un file jar dallo schema core di JibX, e poi in progetti separati ho potuto JibX i miei schemi di busta e semplicemente puntare al jar condiviso invece di dover duplicare la generazione del codice degli schemi core per ogni busta .

Non vedo ancora un modo per JAXB di gestirlo: qualcuno ha avuto successo nel fare qualcosa del genere?

Grazie in anticipo, Roy

Per il RI JAXB , questo è gestito con i file “episodio” (questi sono davvero solo file di personalizzazione). Elabora prima lo schema core assicurandoti che xjc usi l’ -episode arg. Imballare i risultati di tale elaborazione in un file JAR con il file episodio in META-INF/sun-jaxb.episode . Quindi, passare quel file JAR come argomento a xjc durante l’elaborazione degli altri schemi.

Utilizzando un’implementazione JAXB 2.1 (Metro, EclipseLink MOXy , Apache JaxMe, ecc.), È ansible specificare che i tipi di schema corrispondano alle classi esistenti per impedire che vengano generati.

Per esempio:

root.xsd

        

imported.xsd

       

Dichiarazione problema

Se si utilizza lo strumento XJC per generare classi java dallo schema XML:

 xjc -d out root.xsd 

Tu il seguente è generato:

 com\example\imported\Imported.java com\example\imported\ObjectFactory.java com\example\imported\package-info.java com\example\root\ObjectFactory.java com\example\root\Root.java com\example\root\package-info.java 

importata-bindings.xml

È ansible utilizzare un file di bind JAXB per specificare i tipi dal punto importato.xsd alle classi esistenti:

        

Esecuzione di XJC

Ora se eseguiamo XJC senza file di binding:

 xjc -d out -b imported-bindings.xml root.xsd 

Nessuno dei file specificati nel file di bind verrà generato:

 com\example\root\ObjectFactory.java com\example\root\Root.java com\example\root\package-info.java 

Approccio alternativo

Il codice generato direttamente dallo schema importato (xjc imported.xsd) e indirettamente (xjc root.xsd) è lo stesso. Puoi semplicemente rilasciare il codice generato indirettamente e puntare al progetto contenente il codice che è stato generato direttamente.