以编程方式编译Java类?

时间:2015-08-13 01:05:21

标签: java compilation

我找到并修改了下面的代码,以编程方式编译Java类:

import javax.tools.JavaCompiler;
import javax.tools.ToolProvider;

public class CompileHello {

public static void main(String[] args)  {
    JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
    int result = compiler.run(null, null , null , "C:\\Users\\quickCoder\\Desktop\\Hello.java");

    System.out.println("Compile result code = " + result);
    }
}

但是,我一直收到以下错误:

Exception in thread "main" java.lang.NullPointerException
at CompileHello.main(CompileHello.java:8)

Line 8如下:

  int result = compiler.run(null, null , null , "C:\\Users\\quickCoder\\Desktop\\Hello.java");

我确保输入的文件路径是我编写的Java类的实际路径。

2 个答案:

答案 0 :(得分:4)

  1. 我怀疑问题是"编译器"正在返回" null"在Eclipse环境中,但在NetBeans环境中为非null。

  2. 注意:

  3.   

    http://blog.nobel-joergensen.com/2008/07/16/using-eclipse-compiler-to-create-dynamic-java-objects-2/

         

    但是要获得对JDK编译器的访问权限,您需要运行您的   来自JDK的应用程序,因为这不是默认行为,我   选择使用Eclipse编译器instaid。 (除了Eclipse   编译器共享相同的接口,因此两个编译器应该表现出来   相似)。

    1. 如果您想在Eclipse环境中运行,同一链接将讨论如何使用 Eclipse 编译器进行指定。

    2. 但是,您可以指向任何 JDK:

    3. How to set classpath when I use javax.tools.JavaCompiler compile the source?

答案 1 :(得分:1)

编译器是JDK的一部分。如果在JRE中运行此代码,它将失败。整个技术也是如此。重新考虑你的要求。