1

のソースファイルを設定する方法がわかりませんcompilationTask

私はこれを試しました:

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

List<String> optionList = new ArrayList<String>(Arrays.asList("-d","build/classes"));

List<String> classes = new ArrayList<String>();
classes.add("src/Hello.java");
CompilationTask task = compiler.getTask(null, null, null, optionList, classes, null);

task.call();

しかし、次のエラーが発生します。

スレッド"main"の例外java.lang.IllegalArgumentException:有効なクラス名ではありません:src / Hello.java

もちろん、クラスの代わりにnullを指定すると、ソースファイルが指定されていないため、「ソースファイルがありません」というメッセージが表示されます。これまでのrun関数を使ってみJavaCompilerましたが、文字列引数でオプションを指定できませんでした(または方法がわかりません)。

解決策は次のとおりです。

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

        StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
        List<String> optionList = new ArrayList<String>(Arrays.asList("-d","build/classes"));

 Iterable<? extends JavaFileObject> classes = fileManager.getJavaFileObjectsFromFiles(Arrays.asList(new File("src/Hello.java")));


CompilationTask task = compiler.getTask(null, null, null, optionList,null, classes);

task.call();
4

2 に答える 2

0

変更してみてください:

classes.add("src/Hello.java");

に:

classes.add(
  new SimpleJavaFileObject(new URI("src/Hello.java"), JavaFileObject.Kind.SOURCE)
);

少し冗長ですが、機能します。もちろん、メソッドに抽出することもできます。

于 2011-05-12T11:49:57.523 に答える
0

次のコードは問題を解決するはずですが、マシンでコードを実行したときにパスを絶対パスにしました。

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>();
StandardJavaFileManager fm = compiler.getStandardFileManager(diagnostics, null, null);

ArrayList<String> optionList = new ArrayList<String>(Arrays.asList("-d","build/classes"));

ArrayList<File> files = new ArrayList<File>();
files.add(new File("src/Hello.java"));
CompilationTask task = compiler.getTask(null, null, null, optionList, null, fm.getJavaFileObjectsFromFiles(files));

task.call();
于 2011-05-03T17:59:25.783 に答える