2012-03-23 7 views
1

私は動的に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パッケージの方が良いのでしょうか?

答えて

1

例外スタックトレースはコンパイラから取得しません。そうしたのであれば、内部的なコンパイラの失敗の兆候であり、コード内の欠陥ではありません。私はあなたが正確に何を期待しているのかは分からないが、診断メッセージはすべてそこにある。

+0

私はスタックトレースが期待できない理由を理解しています。しかし、私はDiagnosticからより詳細な情報を得ることも期待していました。たとえば、「Symbolを見つけることができません」、「 expected」、その他のコンパイルエラーがあるかどうかを知りたいとします。だから、エラーを区別したい場合、唯一の方法はgetCode()メソッドとgetMessage()メソッドを解析することです。 – zkokaja

+0

@zaidkうん、それはそれだよ。 – EJP

関連する問題