【问题标题】:Create .java file and compile it to a .class file at runtime创建 .java 文件并在运行时将其编译为 .class 文件
【发布时间】:2015-06-18 10:11:14
【问题描述】:

我正在使用 XJC 从 XSD 文件生成一大堆 .java 文件。我还需要将这些文件编译为 .class 文件,并在运行时通过反射使用它们。

我遇到的问题是,在生成 .java 文件并尝试编译它们后,编译器无法正确编译它们并给我以下错误:

.\src\com\program\data\ClassOne.java:44: error: cannot find symbol
    protected List<ClassTwo> description;
                   ^
  symbol:   class ClassTwo
  location: class ClassOne

我假设这与 JVM 不知道我刚刚生成的包的事实有关,因此无法找到引用的类。

这可以通过在生成 .java 文件后简单地重新启动程序来解决。但我很好奇是否有办法在运行时执行这两个步骤而无需重新启动。

我已经研究了如何在运行时“刷新”类路径中的包,但没有成功。

这是我用来编译文件的方法。

public static void compile(Path javaPath, String[] fileList) {
    for (String fileName : fileList) {
        Path fullPath = Paths.get(javaPath.toString(), fileName);

        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
        compiler.run(null, null, null, fullPath.toString());
    }
}

【问题讨论】:

    标签: java compilation runtime


    【解决方案1】:

    所以我终于想通了……

    显然,您可以一次将多个文件传递给编译器,这样就解决了符号错误。多么愚蠢的简单解决方案。

    public static void compile(String... files) {
        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
        compiler.run(null, null, null, files);
    }
    

    【讨论】:

      【解决方案2】:

      您是否尝试过查找相同主题的现有主题? On-the-fly, in-memory java code compilation for Java 5 and Java 6

      例如。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-20
        • 2020-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-16
        • 2015-05-01
        • 1970-01-01
        相关资源
        最近更新 更多