【问题标题】:Get result of compiling a Java source file, within another Java class, using JavaCompiler package使用 JavaCompiler 包在另一个 Java 类中获取编译 Java 源文件的结果
【发布时间】:2012-11-08 11:24:53
【问题描述】:

我的类中有以下(简化的)代码,它调用 Java 编译器来处理给定的源文件:

package test;
import javax.tools.*;

public class SimpleCompileTest {
    public static void main(String[] args) {
        String fileToCompile = "MyClass.java";

        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
        int compilationResult = compiler.run(null, null, null, fileToCompile);

        if(compilationResult == 0){
            System.out.println("Compilation is successful");
        } else {
            System.out.println("Compilation Failed");
        }
    }
}

编译成功了,但是现在我如何得到MyClass.java的结果,如何运行这个编译代码。

【问题讨论】:

标签: java java-compiler-api


【解决方案1】:
package javacompiler;
import javax.tools.JavaCompiler;
import javax.tools.ToolProvider;
public class COmpilerHello {
    public static void main(String[] args)
    {
        String s="C:/Users/MariaHussain/Desktop/hussi.java";
        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
        int result = compiler.run(System.in,System.out,System.err,s);
        System.out.println("Compile result code = " + result);
    }
}

查看结果变量的各种值,如 0,1 2 显示编译状态,是否编译

【讨论】:

    【解决方案2】:

    获取 JavaFileManager,设置保存 .class 文件的位置,然后通过(自定义)类加载器加载它:

    StandardJavaFileManager stdFileManager = compiler.getStandardFileManager(null, Locale.getDefault(), null);
    
    stdFileManager.setLocation(StandardLocation.CLASS_OUTPUT, Arrays.asList(new File("classDir")));
    
     + custom classloader
    

    或者不存储: JavaCompiler from JDK 1.6: how to write class bytes directly to byte[] array?

    您被指向的位置: https://weblogs.java.net/blog/2008/12/17/how-compile-fly

    主要思想是使用自定义 MemoryFileManager 作为 JavaFileManager。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-20
      • 1970-01-01
      • 2011-12-01
      • 2010-12-30
      • 1970-01-01
      • 2011-12-23
      相关资源
      最近更新 更多