2010-11-22 8 views
7

誰かがXJCなしでJAXBスキーマファイルからJavaコードを生成できましたか?動的にオンザフライでJavaコードをコンパイルするために使用Javaソースを動的に生成する(xjcなし)

JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler() 

に幾分類似

注:com.sun.*ツールパッケージがに廃止されていることを意味し、JDK 6で実行している(おかげでヒントのBlaise Doughan

答えて

5

IスタンドアロンのJDK 6がxjcユーティリティクラスへのアクセスを提供しないため、私のソリューションが動作するためのいくつかのJ2EEライブラリを含める必要がありました。

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ソースは、JAXBリファレンス実装hereを取得OUTPUTDIRECTORY

+0

parseSchema中に例外がありました。java.lang.IllegalArgumentException:システムID 'C:\ Users \ Federico \ Documents \ NetBeansProjects \ Wadl2Java \ myxsd.xsdは絶対的ではありません。どうすればよろしいですか? –

+1

ローカルファイルの場合、絶対パスを使用してシステムIDを 'is.setSystemId(schemaFile.toURI()。toString()) 'と設定して解決しました。 –

+0

@Uccioは、休暇中でした。 – Osw

1

以下が役立つことがあります。

+0

ありがとうございます!追加するパッケージが必要ですか?私は、JDK 6クラスパスにcom.sun.tools.xjc。* com.sun.tools.xjc.api。*のどちらも持っていません。 java -version:Java(TM)SEランタイム環境(ビルド1.6.0_22-b04) – Osw

+0

4.2。ツール固有またはcom.sun。* APIの推奨されていません(JDK 6導入ガイド)。 http://www.oracle.com/technetwork/java/javase/adoptionguide-137484.html#4.2 – Osw

1

に配置されます。

Javaコードを生成するためのcom.sun.tools.xjc.api.XJCクラスが含まれています。

3

このコードは、特定のディレクトリにファイルを生成/パッケージ構造:

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

Mavenの中の依存関係を取得する別の方法。

<dependency> 
     <groupId>org.glassfish.jaxb</groupId> 
     <artifactId>jaxb-xjc</artifactId> 
     <version>2.2.11</version> 
    </dependency> 
関連する問題