首先,我看到很多关于使用 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);
...