私は動的にJavaファイルをコンパイルし、コンパイルエラーと例外を1つずつ処理できるようにしたいと考えています。だから私はJavaCompilerを見て、診断を収集するために使用例があります:javax.toolsでJavaCompilerを使用して、より詳細な診断を行う方法や、例外スタックトレースを私に与える方法はありますか?
Iterable<? extends JavaFileObject> compilationUnits = ...;
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnostics, null, null);
compiler.getTask(null, fileManager, diagnostics, null, null, compilationUnits).call();
for (Diagnostic diagnostic : diagnostics.getDiagnostics())
System.out.format("Error on line %d in %d%n",
diagnostic.getLineNumber()
diagnostic.getSource().toUri());
fileManager.close();
これは、すべての罰金とダンディですが、私は戻って取得Diagnosticオブジェクトは、エラーがコンパイル時に発生したコンパイル正確に何を決定する際に非常に有用ではないことを除いて。
実際のメッセージは、実装依存である:より多くの詳細を決定するのに役立ちますが、APIは言う
getMessage()
とgetCode()
方法があります。
移植性にはあまり役に立たないと思われますが、それを解析する場合は、ラウンドアラウンドで行います。 APIを読んでいるときに何か不足しているのか、それともjavax.tools
パッケージの方が良いのでしょうか?
私はスタックトレースが期待できない理由を理解しています。しかし、私はDiagnosticからより詳細な情報を得ることも期待していました。たとえば、「Symbolを見つけることができません」、「 expected」、その他のコンパイルエラーがあるかどうかを知りたいとします。だから、エラーを区別したい場合、唯一の方法はgetCode()メソッドとgetMessage()メソッドを解析することです。 –
zkokaja
@zaidkうん、それはそれだよ。 – EJP