0

JavaCompiler.run()を使用して、動的に生成されたソース ファイルをコンパイルしようとしています。以下は私のプログラムです。実行すると、System.err が表示されます。

javac: ファイルが見つかりません: C:..bla..bla..\test\A.java C:..bla..bla..\test\B.java C:..bla..bla..\test \C.java 使用法: javac use -help 可能なオプションのリスト

ファイルはコンパイルされていませんが、コマンドプロンプトに入るとすべてがコンパイルされました

javac C:..bla..bla..\test\A.java C:..bla..bla..\test\B.java C:..bla..bla..\test\A.java

ここに完全なソースコードがあります

// define the classes
String stringA = "package test;" + " "
    + "public class A { " 
    + "public A() { B b = new B(); b.b(); }" + " "
    + "public static boolean a() { return true;}" + " " 
    + "}";
String stringB = "package test;" + " " 
    + "public class B { " 
    + "public B() { }" + " "
    + "public boolean b() { return new C().c(); }" + " " 
    + "}";
String stringC = "package test;" + " " 
    + "public class C { " 
    + "public C() { }" + " "
    + "public boolean c() { return A.a(); }" + " " 
    + "}";
// Save sources in .java files then compile    
String pathA = store("test/A.java", stringA);
String pathB = store("test/B.java", stringB);
String pathC = store("test/C.java", stringC);

StringBuilder pathBuilder = new StringBuilder();
pathBuilder.append(pathA);
pathBuilder.append(" ");
pathBuilder.append(pathB);
pathBuilder.append(" ");
pathBuilder.append(pathC);

String files = pathBuilder.toString();
// run compiler
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
compiler.run(null, null, null, files);

...

store(filename, source) はファイル ソースを保存し、保存されたファイルへのフル パスを返します。

4

1 に答える 1

0

私は解決策を見つけました。JavaCompiler.run()を次のように呼び出す必要があります。

compiler.run(null, null, null, pathA, pathB, pathC);

異なるパスを連結してrun()に単一の引数を提供する代わりに、ソースファイルへの各パスを個別の引数として提供するだけです! ToolProvider.getSystemJavaCompiler()を通じて提供されるコンパイラでは、すべてのjavacオプション (クラスパスなど) がサポートされているわけではないことに気付きました。

于 2014-01-22T10:02:44.387 に答える