私の使用例は、JDK 6 で提供される ToolProvider および JavaCompiler クラスを使用して、Java プログラムから生成されたソース ファイルをコンパイルすることです。ソース ファイルには、コンテキスト クラスローダー (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();
}
}
スタックトレースは、アノテーション処理中に一度だけ呼び出されたことを示しています。コンパイルするソース ファイルで参照されているクラスがシステム クラスパス上になく、コンテキスト クラスローダーから使用できることを確認しました。