2

首先,我看到很多关于使用 JavaCompilerAPI 的问题,我想澄清一下,我正在创建一个在线模拟构建器,它需要用户的太多输入来预创建类。这就是为什么我使用 java 编译器来编写使用用户输入的类的原因。

至于我的问题,我已经用一些基本的编译器程序进行了测试,目前正在使用这里找到的代码:动态编译而不创建物理文件

代码编译成功,但是当我运行代码时,
ToolProvider.getSystemJavaCompiler(); 返回空值。

从其他条目中,我了解到一个原因可能是默认的 java.home 是 JRE,所以我在我的 JDK 版本中添加了设置 java home 的行:

System.setProperty("java.home", "C:\\Program Files (x86)\\Java\\jdk1.7.0_51;");

我还使用我的程序将 tools.jar 添加到文件夹中,并在类路径中调用指定 tools.jar 的程序,如下所示:

java -cp ".;tools.jar" Compiler

这些方法并没有改变任何东西。关于可能是什么问题的任何想法?

import java.io.IOException;
import java.net.URI;
import java.util.Arrays;
import java.util.Locale;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.tools.JavaCompiler.CompilationTask;
import javax.tools.*;

public class Compiler {

    static final Logger logger = Logger.getLogger(Compiler.class.getName());
        static String sourceCode = "class HelloWorld{"
        + "public static void main (String args[]){"
        + "System.out.println (\"Hello, dynamic compilation world!\");"
        + "}"
        + "}";

    public void doCompilation() {
        System.out.println(System.getProperty("java.home"));
        System.setProperty("java.home", "C:\\Program Files (x86)\\Java\\jdk1.7.0_51;");
        System.out.println(System.getProperty("java.home"));
        SimpleJavaFileObject fileObject = new DynamicJavaSourceCodeObject("HelloWorld",sourceCode);
        JavaFileObject javaFileObjects[] = new JavaFileObject[]{fileObject};

        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
        System.out.println(compiler);

        StandardJavaFileManager stdFileManager = compiler.getStandardFileManager(null, Locale.getDefault(), null);

...

4

0 回答 0