Como uso o JDK6 ToolProvider e o JavaCompiler com o carregador de classe de contexto?
Meu caso de uso é compilar arquivos de origem gerados a partir de um programa java usando as classes ToolProvider e JavaCompiler fornecidas no JDK 6. Os arquivos de origem contêm referências a classes no classloader de contexto (ele é executado em um contêiner J2EE), mas não no classloader do sistema. Meu entendimento é que, por padrão, o ToolProvider criará a instância JavaCompiler com o carregador de classe do sistema.
Existe uma maneira de especificar um carregador de classe para o JavaCompiler usar?
Eu tentei essa abordagem, modificada a partir de algo no IBM DeveloperWorks:
FileManagerImpl fm =
new FileManagerImpl(compiler.getStandardFileManager(null, null, null););
com FileManagerImpl definido como:
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();
}
}
O rastreamento de pilha indica que é chamado apenas uma vez durante o processamento da anotação. Eu verifiquei que a classe referenciada no arquivo de origem a ser compilada não está no caminho de classe do sistema, mas está disponível no carregador de classes de contexto.