动态生成Java源代码(无需使用xjc)

8

有人成功地在没有使用XJC的情况下从JAXB模式文件生成Java代码吗?

与此类似的:

JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler()

用于动态编译Java代码。

注意:在JDK 6上运行,意味着com.sun.*工具包已被弃用。(感谢Blaise Doughan的提示)

5个回答

6

我必须导入一些J2EE库才能让我的解决方案工作,因为独立的JDK 6无法访问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源代码将被放置在outputDirectory目录中。


我在解析模式(parseSchema)时遇到了一个异常:java.lang.IllegalArgumentException: system ID 'C:\Users\Federico\Documents\NetBeansProjects\Wadl2Java\myxsd.xsd' isn't absolute。请问你能帮忙吗? - Federico Bellucci
3
对于本地文件,我解决了使用绝对路径,并将系统 ID 设置为is.setSystemId(schemaFile.toURI().toString()) - Federico Bellucci
@Uccio,抱歉,我去度假了,很高兴你已经解决了问题。 - andbi

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));

    }
}

1

谢谢!我需要额外的包吗?我的JDK 6类路径中没有com.sun.tools.xjc.*和com.sun.tools.xjc.api.*。java -version:Java(TM) SE Runtime Environment(build 1.6.0_22-b04) - andbi
4.2 工具特定或 com.sun.* API 的弃用(JDK 6 采纳指南)。http://www.oracle.com/technetwork/java/javase/adoptionguide-137484.html#4.2 - andbi

1

在此处获取JAXB参考实现here

它包括com.sun.tools.xjc.api.XJC类,允许您生成Java代码。


0

Maven获取依赖的另一种方式:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接