Мой пример использования - компиляция сгенерированных исходных файлов из Java-программы с использованием классов ToolProvider и JavaCompiler, представленных в JDK 6. Исходные файлы содержат ссылки на классы в контекстном загрузчике классов (он запускается в контейнере J2EE), но не в Системный загрузчик классов. Насколько я понимаю, по умолчанию ToolProvider создает экземпляр JavaCompiler с системным загрузчиком классов.
Есть ли способ указать загрузчик классов для использования JavaCompiler?
Я попробовал этот подход, модифицированный от чего-то на IBM DeveloperWorks:
FileManagerImpl fm =
new FileManagerImpl(compiler.getStandardFileManager(null, null, null););
с FileManagerImpl, определенным как:
static final class FileManagerImpl
extends ForwardingJavaFileManager<JavaFileManager> {
public FileManagerImpl(JavaFileManager fileManager) {
super(fileManager);
}
@Override
public ClassLoader getClassLoader(JavaFileManager.Location location) {
new Exception().printStackTrace();
return Thread.currentThread().getContextClassLoader();
}
}
Stacktrace указывает, что он вызывается только один раз во время обработки аннотации. Я проверил, что класс, на который ссылается исходный файл для компиляции, находится не в системном пути к классам, а доступен из контекстного загрузчика классов.