マシンに依存関係がない状態でソースをコンパイルしたい。
例:ファイルA.java:
import some.pkg.B;
public class A extends B {...}
Bソースが存在しないので、問題のシンボル(パッケージ'some.package'とクラスB)を取得するために、JavaFileManagerまたはカスタムClassLoaderのいずれかをフックして、ソースを取得するサービスを使用したいと思います。ストリング。
コンパイルコード:(inputFilesにはA.javaがあります)
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
CustomClassLoader classLoader = new CustomClassLoader();
StandardJavaFileManager standardfileManager = compiler.getStandardFileManager(this, null, null);
JavaFileManager fileManager = new CustomFileManager(standardfileManager, output, classLoader);
CompilationTask task = compiler.getTask(null, fileManager, this, null, null, inputFiles);
boolean result = task.call();
JavaFileManager(getFileForInput ..)およびクラスローダー(findClass、loadClass ..)のフックは、コンパイル時にトリガーされず、エラーメッセージが表示されました。
A.java:#: package some.pkg does not exist
A.java:#: cannot find symbol
symbol: class B
編集
APIをいじって、JavaCompiler(古いバージョン)のソースを調べ、コンパイルの概要を読んだ後でも、構文ツリーからシンボルを提供するために使用できるAPIフックが見つかりません。kschneidによって提案されているように、APIはパッケージ名に基づいてすべてのリソースを取得する必要があるようです。
私が考えた回避策の1つは、JavaCompilerを実行し、欠落しているシンボルのエラーメッセージを分析することです。そうすれば、どのシンボルが必要かを知り、それらを取得して再コンパイルします。
他の回避策/解決策はありますか?