質問
自動作成Java6です。しかし、"はい、出力パスです。しかしトンを生み出そうという思品)に無い.とにかく、こちらのコード
String[] filesToCompile = { "testFiles/Something.java" };
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
Iterable<? extends JavaFileObject> compilationUnits = fileManager.getJavaFileObjects(filesToCompile);
CompilationTask task = compiler.getTask(null, fileManager, null,null, null, compilationUnits);
System.out.println("Good? " + task.call());
ですが、出力はソースディレクトリではないんです。
疑いの答えがあるの compiler.getTask
そのAPIは非常に明確などのパラメーターがあります。それとも何かのfileManager.たって
fileManager.setLocation(StandardLocation.locationFor("testFiles2"), null);
が、推測していくにはおそらく良い方法がありました。
よろしく!
編集: たって使用オプションにおいても、このような(すいませんが、よりコンパクト):
final List<String> optionsList = new ArrayList<String>();
optionsList.add("-d what");
Iterable<String> options = new Iterable<String>() {
public Iterator<String> iterator() {
return optionsList.iterator();
}
};
そのオプションgetTaskが、エラーメッセージが"無効フラグ。"
解決
最初のポスト内のコードは動作しますが、次のエラーGETの投げます:
java.lang.IllegalArgumentException: invalid flag: -d folder
"-d folder"
を渡すことによって、パーサはそれが一つの選択肢を解析だと思わせるためです。オプションは"-d", "folder"
のように分離しなければなりません。
の作業例は次のとおりです。
JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager sjfm = javaCompiler.getStandardFileManager(null, null, null);
String[] options = new String[] { "-d", "output" };
File[] javaFiles = new File[] { new File("src/gima/apps/flip/TestClass.java") };
CompilationTask compilationTask = javaCompiler.getTask(null, null, null,
Arrays.asList(options),
null,
sjfm.getJavaFileObjects(javaFiles)
);
compilationTask.call();
他のヒント
私は今日、これと同じ問題に直面していました。
(代わりに、実行 `の定期getTask
方法を使用して)答えはFileManagerの中で、出力ディレクトリを指定することです。
fileManager.setLocation(StandardLocation.CLASS_OUTPUT, Arrays.asList(outputDir));
そして、それはそれです! :)
ドキュメントは少し誤解を招くおそれがあり、私は意味、サンプルは非常に便利来ることができました。しかし、最終的にはそこに連れて行ってくれました。
編集
ここで実行されているサンプルです。
// write the test class
File sourceFile = new File("First.java");
FileWriter writer = new FileWriter(sourceFile);
writer.write(
"package load.test;\n" +
"public class First{}"
);
writer.close();
// Get the java compiler for this platform
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(
null,
null,
null);
//-- H E R E --//
// Specify where to put the genereted .class files
fileManager.setLocation(StandardLocation.CLASS_OUTPUT,
Arrays.asList(new File("/tmp")));
// Compile the file
compiler
.getTask(null,
fileManager,
null,
null,
null,
fileManager.getJavaFileObjectsFromFiles(Arrays.asList(sourceFile)))
.call();
fileManager.close();
// delete the file
sourceFile.deleteOnExit();
私は0のJava6動的コンパイラです。が誰もいないか回答:)
の作成タスクを取得します FileManager
オブジェクトです。ご利用の場合はインターネットのホームページそのクラスが生成されたソースディレクトリツリーです。なにができるのかはご自身の意志で提供しFileManagerサブクラスは、オーバーライド getFileForOutput
方法。このAPIの説明getFileForOutputことを示しますの影響が出力(=クラス)ファイルかどうかにかかっています。
更新
どのようにフック上のファイル管理者
ForwardingJavaFileManager,ForwardingFileObject、ForwardingJavaFileObject サブクラスは利用をオーバーの挙動を標準のファイルマネージャーとして作成されるメソッドを呼び出をコンパイラ、ソッドを呼び出すと、コンストラクタです。代わりに転送(または代理)を使用する必要があります。これらのクラスで今最も話されたファイルマネージャーまたはファイルオブジェクトがカスタマイズが可能。例えば、どのようにログインすべての通話をJavaFileManager.flush():
final Logger logger = ...;
Iterable<? extends JavaFileObject> compilationUnits = ...;
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager stdFileManager = compiler.getStandardFileManager(null, null, null);
JavaFileManager fileManager = new ForwardingJavaFileManager(stdFileManager) {
public void flush() {
logger.entering(StandardJavaFileManager.class.getName(), "flush");
super.flush();
logger.exiting(StandardJavaFileManager.class.getName(), "flush");
}
};
compiler.getTask(null, fileManager, null, null, null, compilationUnits).call();
更新2
本を読み漁り動作や、自分のアプリではないかと思います。このコードを含むでしょう式(この単純にすることが求められている)です。
package yar;
import javax.tools.JavaCompiler;
import javax.tools.ToolProvider;
public class DynamicCompiler {
JavaCompiler compiler;
public DynamicCompiler() {
this.compiler = ToolProvider.getSystemJavaCompiler();
if (this.compiler == null) {
throw new NullPointerException("Cannot provide system compiler.");
}
}
public void compile() {
this.compiler.run(null, System.out, System.err,
"-d", "testFiles2",
"testFiles/Hello1.java", "testFiles/Hello2.java");
}
/**
* @param args
*/
public static void main(String[] args) {
try {
DynamicCompiler dc = new DynamicCompiler();
dc.compile();
} catch (Exception e) {
System.err.println(e.getMessage());
}
}
}
なんなのかどこのコードを動的に生成されるリストのJavaファイルいろんな compiler.run
各ソースファイルです。