У меня 0 опыта работы с инструментами динамического компилятора Java 6. Но никто не ответил:)
Задача компиляции получает объект FileManager
. Если вы используете стандартный, то классы генерируются в исходном дереве каталогов. Что вы можете сделать, это предоставить свой собственный подкласс FileManager с переопределенным методом getFileForOutput
. Описание API getFileForOutput указывает, что это будет влиять на то, куда пойдут ваши выходные файлы (= class).
Обновление
Как подключить файловые менеджеры
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
отдельно для каждого исходного файла.