public interface JavaCompiler extends Tool, OptionChecker
コンパイラは、コンパイル中にエラー・メッセージなどの診断情報を生成することがあります。 診断リスナーが指定されている場合、診断情報はこのリスナーに提供されます。 リスナーが指定されていない場合、診断情報はなんらかの形式(未指定)でフォーマットされ、デフォルトの出力に書き込まれます。このデフォルトの出力は、特に指定されていなければSystem.errになります。 診断リスナーが指定されていても、一部の診断情報がDiagnosticに適合しない場合があります。この場合、この診断情報はデフォルトの出力に書き込まれます。
コンパイラ・ツールには、標準ファイル・マネージャが関連付けられています。このファイル・マネージャは、コンパイラ・ツールのネイティブ(組込み型)のファイル・マネージャです。 標準ファイル・マネージャを取得するには、getStandardFileManagerを呼び出します。
コンパイラ・ツールは、追加要件(詳細は下記のメソッドを参照)が満たされている限りは、任意のファイル・マネージャで機能する必要があります。 ファイル・マネージャが指定されなかった場合、コンパイラ・ツールは、標準ファイル・マネージャ(たとえばgetStandardFileManagerによって返されるファイル・マネージャ)を使用します。
このインタフェースを実装するインスタンスは、『Java™言語仕様』に準拠していて、かつ『Java™仮想マシン仕様』に準拠したクラス・ファイルを生成する必要があります。 これらの仕様のバージョンは、Toolインタフェースに定義されています。 さらに、このインタフェースのインスタンスのうち、SourceVersion.RELEASE_6以上をサポートするものは、注釈処理もサポートする必要があります。
コンパイラは、診断リスナーとファイル・マネージャの2つのサービスに依存しています。 このパッケージに含まれるほとんどのクラスおよびインタフェースはコンパイラ(およびツール一般)のAPIを定義していますが、DiagnosticListener、JavaFileManager、FileObjectおよびJavaFileObjectの各インタフェースはアプリケーションで使用するためのものではありません。 これらのインタフェースは、コンパイラ用のカスタム・サービスを提供するために実装および使用されます。したがって、コンパイラのSPIを定義します。
このパッケージには、SPIの実装を簡便化し、コンパイラの動作をカスタマイズするためのクラスおよびインタフェースが多数含まれています。
StandardJavaFileManager標準ファイル・マネージャには、次の2つの用途があります。
ファイル・マネージャを再利用することで、ファイル・システムのスキャンとjarファイルの読取りのオーバーヘッドを削減できる可能性があります。 オーバーヘッドが削減されない場合でも、標準ファイル・マネージャは複数のコンパイルを順次処理する必要があります。次の例のようなコーディング・パターンをお薦めします。
File[] files1 = ... ; // input for first compilation task
File[] files2 = ... ; // input for second compilation task
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
Iterable<? extends JavaFileObject> compilationUnits1 =
fileManager.getJavaFileObjectsFromFiles(Arrays.asList(files1));
compiler.getTask(null, fileManager, null, null, null, compilationUnits1).call();
Iterable<? extends JavaFileObject> compilationUnits2 =
fileManager.getJavaFileObjects(files2); // use alternative method
// reuse the same file manager to allow caching of jar files
compiler.getTask(null, fileManager, null, null, null, compilationUnits2).call();
fileManager.close();
DiagnosticCollector
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<? extends JavaFileObject> diagnostic : diagnostics.getDiagnostics())
System.out.format("Error on line %d in %s%n",
diagnostic.getLineNumber(),
diagnostic.getSource().toUri());
fileManager.close();
ForwardingJavaFileManager、ForwardingFileObject、およびForwardingJavaFileObject
final Logger logger = ...;
Iterable<? extends JavaFileObject> compilationUnits = ...;
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager stdFileManager = compiler.getStandardFileManager(null, null, null);
JavaFileManager fileManager = new ForwardingJavaFileManager(stdFileManager) {
public void flush() throws IOException {
logger.entering(StandardJavaFileManager.class.getName(), "flush");
super.flush();
logger.exiting(StandardJavaFileManager.class.getName(), "flush");
}
};
compiler.getTask(null, fileManager, null, null, null, compilationUnits).call();
SimpleJavaFileObject
/**
* A file object used to represent source coming from a string.
*/
public class JavaSourceFromString extends SimpleJavaFileObject {
/**
* The source code of this "file".
*/
final String code;
/**
* Constructs a new JavaSourceFromString.
* @param name the name of the compilation unit represented by this file object
* @param code the source code for the compilation unit represented by this file object
*/
JavaSourceFromString(String name, String code) {
super(URI.create("string:///" + name.replace('.','/') + Kind.SOURCE.extension),
Kind.SOURCE);
this.code = code;
}
@Override
public CharSequence getCharContent(boolean ignoreEncodingErrors) {
return code;
}
}
DiagnosticListener, Diagnostic, JavaFileManager| 修飾子と型 | インタフェース | 説明 |
|---|---|---|
static interface |
JavaCompiler.CompilationTask |
コンパイル・タスクの将来を表すインタフェースです。
|
| 修飾子と型 | メソッド | 説明 |
|---|---|---|
StandardJavaFileManager |
getStandardFileManager(DiagnosticListener<? super JavaFileObject> diagnosticListener, Locale locale, Charset charset) |
このツールの標準ファイル・マネージャ実装の新しいインスタンスを取得します。
|
JavaCompiler.CompilationTask |
getTask(Writer out, JavaFileManager fileManager, DiagnosticListener<? super JavaFileObject> diagnosticListener, Iterable<String> options, Iterable<String> classes, Iterable<? extends JavaFileObject> compilationUnits) |
指定のコンポーネントおよび引数を持つコンパイル・タスクの将来を作成します。
|
getSourceVersions, runisSupportedOptionJavaCompiler.CompilationTask getTask(Writer out, JavaFileManager fileManager, DiagnosticListener<? super JavaFileObject> diagnosticListener, Iterable<String> options, Iterable<String> classes, Iterable<? extends JavaFileObject> compilationUnits)
ファイル・マネージャが指定されている場合、StandardLocationに定義されているすべての場所を処理できなければなりません。
注釈処理は、compilationUnitsパラメータで渡されたコンパイル対象のソース・コードのコンパイル・ユニットと、classesパラメータで名前が渡されたクラス・ファイルの両方を処理できます。
out - コンパイラからの追加出力に使用するWriter。nullの場合はSystem.errを使用fileManager - ファイル・マネージャ。nullの場合はコンパイラの標準ファイル・マネージャを使用diagnosticListener - 診断リスナー。nullの場合、コンパイラのデフォルトのメソッドを使って診断情報を報告options - コンパイラ・オプション。nullの場合、オプションは存在しないclasses - 注釈処理によって処理されるクラスの名前。nullの場合、クラス名は存在しないcompilationUnits - コンパイル対象のコンパイル・ユニット。nullの場合、コンパイル・ユニットは存在しないRuntimeException - ユーザー指定のコンポーネントで回復不可能なエラーが発生した場合。 causeはユーザー・コード内のエラー。 IllegalArgumentException - いずれかのオプションが無効であるか、ソースとは別の種類のコンパイル・ユニットが指定された場合StandardJavaFileManager getStandardFileManager(DiagnosticListener<? super JavaFileObject> diagnosticListener, Locale locale, Charset charset)
標準ファイル・マネージャは、flushまたはcloseの呼出しのあとでアクセスされると、自動的に再起動します。 標準ファイル・マネージャは、その他のツールから利用できなければいけません。
diagnosticListener - 致命的でない診断情報用の診断リスナー。nullの場合、コンパイラのデフォルトのメソッドを使って診断情報を報告locale - 診断情報のフォーマット時に適用されるロケール。nullの場合、デフォルトのロケールが適用される。charset - バイトのデコードに使用された文字セット。nullの場合、プラットフォームのデフォルトの文字セットを使用 バグまたは機能を送信
詳細なAPIリファレンスおよび開発者ドキュメントについては、Java SEのドキュメントを参照してください。 そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright © 1993, 2025, Oracle and/or its affiliates. All rights reserved. Use is subject to license terms. Documentation Redistribution Policyも参照してください。