2010-11-22 32 views
7

¿Alguien ha logrado generar código java desde un archivo de esquema JAXB sin XJC?Genera dinámicamente fuentes Java (sin xjc)

Algo similar a

JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler() 

utilizado para compilar el código Java de forma dinámica sobre la marcha. Correr en JDK 6, lo que significa que los paquetes com.sun.* herramientas están en desuso (gracias Blaise Doughan por la pista)

Respuesta

5

I

Nota

Tuve que incluir algunas bibliotecas J2EE para que mi solución funcionara porque el JDK 6 independiente no proporciona acceso a las clases de utilidad xjc:

import com.sun.codemodel.*; 
import com.sun.tools.xjc.api.*; 
import org.xml.sax.InputSource; 

// Configure sources & output 
String schemaPath = "path/to/schema.xsd"; 
String outputDirectory = "schema/output/source/"; 

// Setup schema compiler 
SchemaCompiler sc = XJC.createSchemaCompiler(); 
sc.forcePackageName("com.xyz.schema.generated"); 

// Setup SAX InputSource 
File schemaFile = new File(schemaPath); 
InputSource is = new InputSource(new FileInputStream(schemaFile)); 
is.setSystemId(schemaFile.getAbsolutePath()); 

// Parse & build 
sc.parseSchema(is); 
S2JJAXBModel model = sc.bind(); 
JCodeModel jCodeModel = model.generateCode(null, null); 
jCodeModel.build(new File(outputDirectory)); 

* .java fuentes serán colocados en OutputDirectory

+0

Tuve una excepción durante parseSchema: 'java.lang.IllegalArgumentException: ID del sistema 'C: \ Users \ Federico \ Documents \ NetBeansProjects \ Wadl2Java \ myxsd.xsd 'no es absoluto' ¿Puede ayudarme por favor? –

+1

Para los archivos locales que resolví usando rutas absolutas y estableciendo el id del sistema como 'is.setSystemId (schemaFile.toURI(). ToString())' –

+0

@Uccio, lo siento, estaba de vacaciones, me alegro de que hayas resuelto el problema. – Osw

1
+0

¡Gracias! ¿Necesito paquetes adicionales para incluir? No tengo ninguno de com.sun.tools.xjc. * Com.sun.tools.xjc.api. * En mi classpath JDK 6. java -version: Java (TM) SE Runtime Environment (compilación 1.6.0_22-b04) – Osw

+0

4.2.Depreación de cualquier API específica de la herramienta o com.sun. * (guía de adopción de JDK 6). http://www.oracle.com/technetwork/java/javase/adoptionguide-137484.html#4.2 – Osw

1

Obtener la implementación de referencia JAXB here.

Incluye la clase com.sun.tools.xjc.api.XJC que le permite generar el código de Java.

3

Este código genera archivos en directorios específicos/estructura del paquete:

import java.io.File; 
import java.io.IOException; 

import org.xml.sax.InputSource; 

import com.sun.codemodel.JCodeModel; 
import com.sun.tools.xjc.api.S2JJAXBModel; 
import com.sun.tools.xjc.api.SchemaCompiler; 
import com.sun.tools.xjc.api.XJC; 

public class JAXCodeGen { 
    public static void main(String[] args) throws IOException { 

      String outputDirectory = "E:/HEAD/JAXB/src/"; 

      // Setup schema compiler 
      SchemaCompiler sc = XJC.createSchemaCompiler(); 
      sc.forcePackageName("com.xyz.schema"); 

      // Setup SAX InputSource 
      File schemaFile = new File("Item.xsd"); 
      InputSource is = new InputSource(schemaFile.toURI().toString()); 
      // is.setSystemId(schemaFile.getAbsolutePath()); 

      // Parse & build 
      sc.parseSchema(is); 
      S2JJAXBModel model = sc.bind(); 
      JCodeModel jCodeModel = model.generateCode(null, null); 
      jCodeModel.build(new File(outputDirectory)); 

    } 
} 
0

Otra forma de obtener las dependencias de Maven;

<dependency> 
     <groupId>org.glassfish.jaxb</groupId> 
     <artifactId>jaxb-xjc</artifactId> 
     <version>2.2.11</version> 
    </dependency> 
Cuestiones relacionadas