2011-05-03 7 views
6

¿JAXB admite la generación de código modular?JAXB - Creación de módulos para reutilización

La mayor parte de mi experiencia es con JibX para clasificación de XML, pero por razones heredadas nuestra firma está utilizando JAXB.

Una característica que estaba disponible para JIBX era modular code generation. Supongamos que tengo un esquema principal, pero tengo varios sobres diferentes para ese esquema. Con JibX pude crear un archivo jar del esquema central de JibX, y luego en proyectos separados podría hacer que JibX mis esquemas de envolvente y simplemente apuntar al contenedor compartido en lugar de tener que duplicar la generación de código de los esquemas centrales para cada sobre .

Aún no veo una forma de que JAXB maneje esto - ¿Alguien ha tenido éxito haciendo algo como esto?

Gracias de antemano, Roy

Respuesta

9

Para el JAXB RI, eso se maneja con archivos "episodio" (estos son realmente solo archivos de personalización). Primero procese el esquema del núcleo, asegurándose de tener xjc usando el -episode <file> arg. Empaque los resultados de ese procesamiento en un archivo JAR con el archivo del episodio en META-INF/sun-jaxb.episode. Luego, pase ese archivo JAR como arg a xjc cuando procese los otros esquemas.

+3

+1 - Este es un ejemplo del uso de archivos de episodios: http: // weblogs.java.net/blog/kohsuke/archive/2006/09/separate_compil.html?force=741 –

+0

¡Hermoso, gracias! –

3

Usando una aplicación JAXB 2.1 (Metro, EclipseLink MOXy, Apache JaxMe, etc.), se puede especificar que el esquema tipos corresponden a las clases existentes con el fin de evitar que se genere.

Por ejemplo:

root.xsd

<?xml version="1.0"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.com/root"> 
    <xsd:import schemaLocation="imported.xsd" namespace="http://www.example.com/imported"/> 
    <xsd:complexType name="root"> 
     <xsd:attribute name="root-prop" type="xsd:string"/> 
    </xsd:complexType> 
</xsd:schema> 

imported.xsd

<?xml version="1.0"?> 
<xsd:schema 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns="http://www.example.com/imported" 
    targetNamespace="http://www.example.com/imported"> 
    <xsd:complexType name="imported"> 
     <xsd:attribute name="imported-prop" type="xsd:string"/> 
    </xsd:complexType> 
</xsd:schema> 

Planteamiento del problema

Si se utiliza la herramienta XJC para generar clases Java desde el esquema XML:

xjc -d out root.xsd 

Usted se genera el siguiente:

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 

importados-bindings.xml

Puede utilice un archivo de enlaces JAXB para especificar que los tipos de importado.xsd apuntan a las clases existentes:

<jxb:bindings 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
    version="2.1"> 

    <jxb:bindings schemaLocation="imported.xsd"> 
      <jxb:bindings node="//xs:complexType[@name='imported']"> 
       <jxb:class ref="com.example.imported.Imported"/> 
      </jxb:bindings> 
    </jxb:bindings> 
</jxb:bindings> 

Ejecución del XJC

Ahora bien, si corremos XJC con fijaciones Ficha:

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

Ninguno de los archivos especificados en el archivo de enlaces se generará:

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

Enfoque alternativo

El código generado directamente desde el esquema importado (xjc imported.xsd) e indirectamente (xjc root.xsd) es el mismo. Simplemente puede soltar el código generado indirectamente y apuntar al proyecto que contiene el código que se generó directamente.

+0

Mientras que el enfoque del archivo de enlaces funciona para suprimir la generación de los tipos complejos desde el esquema importado, parece fallar para los tipos simples. Ver: http://stackoverflow.com/questions/16815798/jaxb-xjc-2-2-not-recognizing-bindings-for-simple-types –

Cuestiones relacionadas