2010-11-22 7 views
7

Est-ce que quelqu'un a réussi à générer du code java à partir d'un fichier de schéma JAXB sans XJC?Générer dynamiquement des sources java (sans xjc)

Un peu similaire à

JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler() 

utilisé pour compiler dynamiquement code Java à la volée.

Remarque: L'exécution sur JDK 6, ce qui signifie que com.sun.* outils paquets sont déconseillés (merci Blaise Doughan pour l'indice)

Répondre

5

I a dû inclure certaines bibliothèques J2EE pour que ma solution fonctionne car le JDK 6 autonome ne fournit aucun accès aux classes d'utilitaires 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)); 

* sources .java seront placés dans outputDirectory

+0

J'ai eu une exception pendant parseSchema: 'java.lang.IllegalArgumentException: ID système 'C: \ Users \ Federico \ Documents \ NetBeansProjects \ Wadl2Java \ myxsd.xsd 'n'est pas absolue' Pouvez-vous aider s'il vous plaît? –

+1

Pour les fichiers locaux, j'ai résolu en utilisant les chemins absolus et en définissant l'ID système comme 'is.setSystemId (schemaFile.toURI(). ToString())' –

+0

@Uccio, désolé, était en vacances, heureux que vous ayez résolu le problème. – Osw

1

Les éléments suivants peuvent aider:

+0

Merci! Ai-je besoin de paquets supplémentaires à inclure? Je n'ai ni com.sun.tools.xjc. * Com.sun.tools.xjc.api. * Dans mon classpath JDK 6. java -version: Java (TM) SE Environnement d'exécution (build 1.6.0_22-b04) – Osw

+0

4.2.Déprécation de toute API spécifique à l'outil ou com.sun. * (Guide d'adoption du JDK 6). http://www.oracle.com/technetwork/java/javase/adoptionguide-137484.html#4.2 – Osw

1

Obtenez l'implémentation de référence JAXB here.

Il inclut la classe com.sun.tools.xjc.api.XJC qui vous permet de générer le code Java.

3

Ce code génère des fichiers à des répertoires spécifiques/structure du package:

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

Une autre façon d'obtenir les dépendances Maven;

<dependency> 
     <groupId>org.glassfish.jaxb</groupId> 
     <artifactId>jaxb-xjc</artifactId> 
     <version>2.2.11</version> 
    </dependency> 
Questions connexes