モジュール java.compiler
パッケージ javax.tools

インタフェースJavaCompiler

すべてのスーパー・インタフェース:
OptionChecker, Tool

public interface JavaCompiler
extends Tool, OptionChecker
プログラムからJavaプログラミング言語コンパイラを起動するインタフェースです。

コンパイラは、コンパイル中にエラー・メッセージなどの診断情報を生成することがあります。 診断リスナーが指定されている場合、診断情報はこのリスナーに提供されます。 リスナーが指定されていない場合、診断情報はなんらかの形式(未指定)でフォーマットされ、デフォルトの出力に書き込まれます。このデフォルトの出力は、特に指定されていなければ System.errになります。 診断リスナーが指定されていても、一部の診断情報が Diagnosticに適合しない場合があります。この場合、この診断情報はデフォルトの出力に書き込まれます。

コンパイラ・ツールには、標準ファイル・マネージャが関連付けられています。このファイル・マネージャは、コンパイラ・ツールのネイティブ(組込み型)のファイル・マネージャです。 標準ファイル・マネージャを取得するには、getStandardFileManagerを呼び出します。

コンパイラ・ツールは、追加要件(詳細は下記のメソッドを参照)が満たされている限りは、任意のファイル・マネージャで機能する必要があります。 ファイル・マネージャが指定されなかった場合、コンパイラ・ツールは、標準ファイル・マネージャ(たとえばgetStandardFileManagerによって返されるファイル・マネージャ)を使用します。

このインタフェースを実装するインスタンスは、「Java言語仕様」に準拠し、「Java Virtual Machine仕様」に準拠するクラス・ファイルを生成する必要があります。 これらの仕様のバージョンは、Toolインタフェースに定義されています。 さらに、このインタフェースのインスタンスのうち、SourceVersion.RELEASE_6以上をサポートするものは、注釈処理もサポートする必要があります。

コンパイラは、診断リスナーファイル・マネージャの2つのサービスに依存しています。 このパッケージに含まれるほとんどのクラスおよびインタフェースはコンパイラ(およびツール一般)のAPIを定義していますが、DiagnosticListenerJavaFileManagerFileObjectおよびJavaFileObjectの各インタフェースはアプリケーションで使用するためのものではありません。 これらのインタフェースは、コンパイラ用のカスタム・サービスを提供するために実装および使用されます。したがって、コンパイラのSPIを定義します。

このパッケージには、SPIの実装を簡便化し、コンパイラの動作をカスタマイズするためのクラスおよびインタフェースが多数含まれています。

StandardJavaFileManager
このインタフェースを実装するすべてのコンパイラは、通常のファイルを操作する標準ファイル・マネージャを提供します。 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();
ForwardingJavaFileManagerForwardingFileObject、およびForwardingJavaFileObject
標準ファイル・マネージャの動作をオーバーライドする目的でサブクラス化を行うことはできません。これは、標準ファイル・マネージャはコンストラクタの呼出しによってではなく、コンパイラでメソッドを呼び出すことによって作成されるためです。 サブクラス化の代わりに、転送(または委譲)を使用する必要があります。 これらのクラスを使用すると、ほとんどの呼出しを簡単に指定のファイル・マネージャまたはファイル・オブジェクトに転送できるだけでなく、ファイル・マネージャの動作のカスタマイズもできます。 たとえば、JavaFileManager.flush()の呼出しをすべてログに記録するには、次のようにします。
       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;
           }
       }

導入されたバージョン:
1.6
関連項目:
DiagnosticListener, Diagnostic, JavaFileManager
  • メソッドの詳細

    • getTask

      JavaCompiler.CompilationTask getTask​(Writer out, JavaFileManager fileManager, DiagnosticListener<? super JavaFileObject> diagnosticListener, Iterable<String> options, Iterable<String> classes, Iterable<? extends JavaFileObject> compilationUnits)
      指定のコンポーネントおよび引数を持つコンパイル・タスクの将来を作成します。 コンパイルは、CompilationTaskインタフェースに記述されているとおりに行われていない可能性があります。

      ファイル・マネージャが指定されている場合、StandardLocationに定義されているすべての場所を処理できなければなりません。

      注釈処理は、compilationUnitsパラメータで渡されたコンパイル対象のソース・コードのコンパイル・ユニットと、classesパラメータで名前が渡されたクラス・ファイルの両方を処理できます。

      パラメータ:
      out - コンパイラからの追加出力に使用するWriter。nullの場合はSystem.errを使用
      fileManager - ファイル・マネージャ。nullでコンパイラ標準ファイル・マネージャを使用する場合
      diagnosticListener - 診断リスナー。 nullの場合、コンパイラのデフォルトのメソッドを使って診断情報を報告
      options - コンパイラ・オプション。nullの場合、オプションは存在しない
      classes - 注釈処理によって処理されるクラスの名前。nullの場合、クラス名は存在しない
      compilationUnits - コンパイル対象のコンパイル・ユニット。 nullの場合、コンパイル・ユニットは存在しない
      戻り値:
      コンパイルを表すオブジェクト
      例外:
      RuntimeException - ユーザー指定のコンポーネントで回復不可能なエラーが発生した場合。 causeはユーザー・コード内のエラー。
      IllegalArgumentException - いずれかのオプションが無効であるか、ソースとは別の種類のコンパイル・ユニットが指定された場合
    • getStandardFileManager

      StandardJavaFileManager getStandardFileManager​(DiagnosticListener<? super JavaFileObject> diagnosticListener, Locale locale, Charset charset)
      このツールの標準ファイル・マネージャ実装の新しいインスタンスを返します。 ファイル・マネージャは、致命的ではない診断情報の生成に、指定の診断リスナーを使用します。 致命的エラーが発生した場合、適切な例外によって通知されます。

      標準ファイル・マネージャは、flushまたはcloseの呼出しのあとでアクセスされると、自動的に再起動します。 標準ファイル・マネージャは、その他のツールから利用できなければいけません。

      パラメータ:
      diagnosticListener - 致命的でない診断情報用の診断リスナー。nullの場合、コンパイラのデフォルトのメソッドを使って診断情報を報告
      locale - 診断情報のフォーマット時に適用されるロケール。nullの場合、デフォルトのロケールが適用される。
      charset - バイトのデコードに使用された文字セット。nullの場合、プラットフォームのデフォルトの文字セットを使用
      戻り値:
      標準ファイル・マネージャ