まず、JavaCompilerAPI の使用について多くの質問が寄せられています。クラスを事前に作成するためにユーザーからの入力が多すぎるオンライン シミュレーション ビルダを作成していることを明確にしたいと思います。そのため、ユーザーの入力を使用してクラスを作成するために、Java コンパイラを使用しています。
私の問題については、いくつかの基本的なコンパイラ プログラムでテストし、現在、ここにあるコードで作業しています:物理ファイルを作成しない動的コンパイル
コードのコンパイルは成功しましたが、コードを実行すると、
ToolProvider.getSystemJavaCompiler(); null を返します。
他のエントリから、デフォルトの java.home が JRE であることが 1 つの原因である可能性があることがわかりました。そのため、Java ホームを JDK バージョンに設定する行を追加しました。
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);
...