Javac

説明

Javaソースツリーをコンパイルします。

Javaソースファイルをコンパイルするために、 コンパイル元とコンパイル先のディレクトリを再帰的に走査します。 Javaファイルは、対応する.classファイルが存在しないか、 .javaファイルよりもクラスファイルが古い場合にのみ、 コンパイルされます。

注意: Antは、リビルドが必要なクラスを見つけるために、 ソースとクラスのファイル名だけを使用します。 ネストクラスに関しては、ソースファイルとクラスファイルの名前が異なり、 ソースが検索されません。 存在/更新時間だけでない、他の方法による依存性の検査をするには、 <depend> タスクを見てください。

ソースファイルがパッケージの一部のときは、 ソースツリーのディレクトリ構造は、パッケージ階層に従っていなければいけません。

コンパイルされるファイルの集合を絞り込むことができます。 これにはincludesincludesfileexcludesexcludesfile属性を使用することができます。 includesやincludesfile属性を使って、取り込みたいファイルを指定します。 excludeやexcludesfile属性は、除外したいファイルを指定するために使用します。 両方のケースで、ファイル名か関連するディレクトリ(複数)を使って、 ファイルのリストを指定できます。 srcdir属性、ネストした<src>要素(複数)、 ワイルドカードを含むパターンを使います。 ファイルの包含/排他の処理方法や、ワイルドカードパターンの記述方法については ディレクトリベースのタスク の章を見てください。

異なるコンパイラを使用できます。 これは、build.compilerプロパティーで指定でき、 ビルドを通して、すべての<javac>タスクに影響します。 またはcompiler属性を使うと、 現在の<javac>タスクに対して指定できます。 build.compilerプロパティーとcompiler属性 に有効な値は次のものです:

デフォルトはjavac1.xで、xは Antを実行するときに使用したJDKのバージョンに依存します。 これらの提供されたコンパイラの他に、 異なるコンパイラのインターフェイスを使いたい場合は、 CompilerAdapterインターフェイス(org.apache.tools.ant.taskdefs.compilersパッケージ) を実装したクラスを書くことができます。 build.compilerプロパティーかcompiler属性に 完全クラス名を指定してください。

fork属性はbuild.compilerプロパティーや compiler属性の指定を上書きし、 JAVA_HOMEで指定されたJDK1.1以降のコンパイラが期待されています。

compiler属性を使うことで、 コマンドラインスイッチを使いたいときに、 AntにどのJDKのバージョンを使うかを伝えることができます。 fork="true"を指定した場合でも適用されます。 これは、JDK1.2+を使っていて、JDK1.1を実行したいときに便利です。 compiler="javac1.1"と (例えば)depend="true"を指定したとき、 Antは-Xdependの代わりに -dependのコマンドラインスイッチを使用します。

このタスクはコンパイラに渡すクラスパスから、存在しない ファイルやディレクトリへのすべてのエントリーを省きます。

Windows 注意: Windows上でforkなしのモードで、modernコンパイラが使われている場合、 <javac>タスクのクラスパス中の 存在するファイルをロックし、これらを開放しません。 この副作用として、ビルド中は これらのファイルを削除、移動することができません。 これの対処は、コンパイラを実行するときにforkすることです。

パラメータ

属性 説明 必須
srcdir Javaファイルの場所(下の Noteを参照)。 ネストした<src> 要素が存在しないかぎりYes
destdir クラスファイルを保存する場所 No
includes 包括するファイル(ワイルドカードを使って指定が可能)の カンマかスペースで区切られたリスト。 省略した時には、すべてのファイルを含みます。 No
includesfile 包括するファイル(ワイルドカードを使って指定が可能)の リストを記述したファイルの名前。 No
excludes 除外するファイル(ワイルドカードを使って指定が可能)の カンマかスペースで区切られたリスト。 省略したときには(デフォルト除外集合を除けば)除外されるファイルはありません。 No
excludesfile 除外するファイル(ワイルドカードを使って指定が可能)の リストを記述したファイルの名前。 No
classpath 使用するクラスパス No
sourcepath 使用するソースパス。 デフォルトはsrcdir属性(あるいはネストした<src>要素)の値です。 sourcepathスイッチを抑制するにはsourcepath=""を使ってください。 No
bootclasspath ブートストラップのクラスファイルの場所 No
classpathref 使用するクラスパスで、 他で定義されているPATHに対する参照を指定します。 No
sourcepathref 使用するソースパスで、 他で定義されているPATHに対する参照を指定します。 No
bootclasspathref ブートストラップのクラスファイルの場所で、 他で定義されているPATHに対する参照を指定します。 No
extdirs インストール済み拡張機能の場所 No
encoding ソースファイルのエンコーディング (Note: gcjではまだこのオプションはサポートされていません)。 No
nowarn コンパイラに-nowarnスイッチを渡すかどうか を指定します。デフォルトはoffです。 No
debug デバッグ情報を付けてコンパイルするかどうかを指定します。 デフォルトはoffです。 off-g:noneに設定すると、 コンパイラのコマンドラインの通過をサポートします。 (他のコンパイラで、コマンドライン引数がない時に使われます。) trueを設定すると、debuglevel属性の値は、 コマンドライン引数を決めます。 No
debuglevel -gコマンドラインスイッチに追加する キーワードのリスト。 modernclassic(ver >= 1.2) 以外の実装では、無視されます。 正式な値はnoneか、カンマで区切られた次のキーワードのリストです。 linesvarssourcedebuglevelが指定されなかった場合は、 デフォルトで-gに何も付加されません。 debugが有効でない場合は、この属性は無視されます。 No
optimize 最適化オプションを付けてコンパイルするかどうか を指定します。デフォルトはoffです。 No
deprecation deprecation情報をつけてコンパイルするかどうか を指定します。デフォルトはoffです。 No
target 指定したVMのバージョンに対して、クラスファイルを生成します (例、1.11.2)。 デフォルトの値はAntを実行しているJVMに依存することに注意してください。 特に、JDK1.4以上を使う場合、生成されたクラスは、 この属性を1.1の値にしないかぎり、1.1のjava VMで使用できません。 (JDK1.1をデフォルトで利用できるのは1.3までです) No
verbose コンパイラに冗長な出力をさせます。デフォルトは、no No
depend 依存性の追跡をサポートしているコンパイラ (jikesclassic)で、 それを有効にします。 No
includeAntRuntime Antランタイムライブラリをクラスパスに含めるかどうか。 デフォルトはyesです。 No
includeJavaRuntime 実行するVMのデフォルトのランタイムライブラリを クラスパスに含めるかどうか。 デフォルトはnoです。 No
fork 外部のJDKコンパイラを使ってjavacを 実行するかどうか。 デフォルトはnoです。 No
executable executableはfork="yes"の場合に 使用されます。 デフォルトは現在Antを実行しているJavaのバージョンのコンパイラです。 fork="no"のときは無視されます。
Ant 1.6からこの属性は、jikes、jvc、gcj、sj使用時にexecutableへパスの指定ができます。
No
memoryInitialSize 基本的なVMに割り当てるメモリの初期サイズ。 javacが外部で実行された場合以外は無視されます。 デフォルトは標準のVMのメモリ設定です (例:8388608081920k80m) No
memoryMaximumSize 基本的なVMに割り当てるメモリの最大サイズ。 javacが外部で実行された場合以外は無視されます。 デフォルトは標準のVMのメモリ設定です (例:8388608081920k80m) No
failonerror コンパイルが失敗したときに、ビルドを続けるかどうかを指定します。 デフォルトはtrueです。 No
source -sourceコマンドラインスイッチの値です。 javac1.4 (あるいはAntを1.3のVMで実行していないときのmodern) やjikesを除いた実装前では、無視されます。
jikesでこの属性を使う場合は、 -sourceスイッチをサポートするjikesのバージョンで なければなりません。
正式な値は1.31.41.5で、 デフォルトでは-source属性は使われません。
No
compiler コンパイラの実装に使います。 もしこの属性が設定されていなければ、build.compilerプロパティの値になり、 設定されていれば、それが使われます。 他には、現在のVMのデフォルトコンパイラが使われます。 (有効なコンパイラのリストを参照してください。) No
listfiles コンパイルされるソースファイルがリストされているか示します。デフォルトは、no No
tempdir Antが作業ファイルを置くべき場所です。 もしタスクが分けられ、コマンドライン引数の長さが4kを超えるときだけに、これは使われます。 Ant 1.6から No。デフォルトは、現在の作業ディレクトリ

ネストした要素として指定されるパラメタ

このタスクは暗黙のファイルセットを持っていて、 ネストした<include><exclude><patternset>要素 と同様に、 <fileset>の属性(dirsrcdirになります) のすべてをサポートします。

srcclasspathsourcepathbootclasspathextdirs

<javac>srcdirclasspathsourcepathbootclasspathextdirs属性は パス類似構造であり、 それぞれネストした <src><classpath><sourcepath><bootclasspath><extdirs>要素によって指定することができます。

compilerarg

ネストした<compilerarg>要素で、 コンパイラに対して追加のコマンドライン引数を指定することができます。 これらの要素はコマンドライン引数のように指定できますが、 有効な引数として使えるのは追加する属性が、与えられたコンパイラの実装で 使われている場合のみです。

属性 説明 必須
value コマンドライン引数を参照 必ずこのうちの1つ
line
file
path
compiler 選択されたコンパイラ実装が、この属性の値と合う場合のみ、 指定した引数が渡されます。 正式な値は、上の有効なコンパイラのリスト と同じものです。) No

  <javac srcdir="${src}"
         destdir="${build}"
         classpath="xyz.jar"
         debug="on"
  />

${src}ディレクトリ以下のすべての.javaファイル をコンパイルし、.classファイルを${build}ディレクトリに保存します。 使用するクラスパスはxyz.jarを含み、 デバッグ情報をonにしてコンパイルします。

  <javac srcdir="${src}"
         destdir="${build}"
         fork="true"
  />

${src}ディレクトリ以下のすべての.javaファイル をコンパイルし、.classファイルを${build}ディレクトリに保存します。 これは、デフォルトのjavac実行を使って、 javacコンパイルをフォークします。

  <javac srcdir="${src}"
         destdir="${build}"
         fork="java$$javac.exe"
  />

${src}ディレクトリ以下のすべての.javaファイル をコンパイルし、.classファイルを${build}ディレクトリに保存します。 これは、java$javac.exeという名前の実行ファイルを使って、 javacコンパイラをフォークします。 $記号が2つめの$でエスケープされることに注意してください。

  <javac srcdir="${src}"
         destdir="${build}"
         includes="mypackage/p1/**,mypackage/p2/**"
         excludes="mypackage/p1/testpackage/**"
         classpath="xyz.jar"
         debug="on"
  />

${src}ディレクトリ以下のすべての.javaファイル をコンパイルし、.classファイルを${build}ディレクトリに保存します。 使用するクラスパスはxyz.jarを含み、デバッグ情報がonになっています。 mypackage/p1mypackage/p2以下のファイルだけが使用されます。 mypackage/p1/testpackageディレクトリ内およびその下のファイルは、 コンパイルから除外されます。

  <javac srcdir="${src}:${src2}"
         destdir="${build}"
         includes="mypackage/p1/**,mypackage/p2/**"
         excludes="mypackage/p1/testpackage/**"
         classpath="xyz.jar"
         debug="on"
  />

これは、前のサンプルと同じですが、プロパティsrc2で定義される二番目のソースパスが追加されています。 これは、次のようなネストした<src>要素を使用しても記述できます。

  <javac destdir="${build}"
         classpath="xyz.jar"
         debug="on">
    <src path="${src}"/>
    <src path="${src2}"/>
    <include name="mypackage/p1/**"/>
    <include name="mypackage/p2/**"/>
    <exclude name="mypackage/p1/testpackage/**"/>
  </javac>

異なるJDKのjavacコンパイラを実行したい場合、 コンパイラを探す場所、使用するJDKのバージョンを、 正しいコマンドラインスイッチを選択して、 Antに伝えなければなりません。 次の例は新しいプロセスでJDK1.1のjavacを実行します。 Antが異なるバージョンのJava VMで実行されても、 正しいコマンドラインスイッチが使われます。

  <javac srcdir="${src}"
         destdir="${build}"
         fork="yes"
         executable="/opt/java/jdk1.1/bin/javac"
         compiler="javac1.1"
  />

注意: 普通にルート以下のあるパッケージのソースファイルだけをコンパイルしたい場合、 パッケージをフィルターするために include/exclude属性や <include>/<exclude>のネストされた要素 を使ってください。 srcdir属性(あるいはネストした<src>要素)で、 パッケージ構造の一部を含めないでください。 Antはコンパイルのターゲットを実行する度にソースファイルをリコンパイルします。 追加情報はAnt FAQ を参照してください。

明確に指定されたファイルのみのコンパイルを希望して、 javacのデフォルト検索メカニズムを無効にするならば、 sourcepath属性をセットしないことができます。

  <javac sourcepath="" srcdir="${src}"
         destdir="${build}" >
    <include name="**/*.java" />
    <exclude name="**/Example.java" />
  </javac>

この方法でjavacは、"${src}"ディレクトリ以下すべてのjavaソースファイルをコンパイルしますが、exampleをスキップします。 もし、exampleでないファイルがそれらを参照すれば、コンパイラはエラーを生成します。

注意: Windows上でAntを使用する場合には、外部コンパイラを使用するたびに新しいDOSのウィンドウがポップアップしますが、 これはあなたが使用しているJDKの問題だと思われます。 この問題は、JDK< 1.2のすべてのJDKで発生する可能性があります。

Jikes 注意

Jikes は、 タスクを呼び出す前に、以下に示すようなプロパティーを設定することで、 いくつかの拡張オプションをサポートします。 各プロパティーの設定は、ビルドを通して、 すべての<javac>タスクに影響を与えます。 Antの開発者は、これは醜く融通の利かないことだと気づきます。 – 将来はもっとよい方法が期待されています。 すべてのオプションはbooleanで、falseの他に解釈されるには、 trueyesを設定しなければなりません。 デフォルトでは、build.compiler.warningstrueで、 他のすべてのプロパティーはfalseです。

プロパティー 説明 デフォルト
build.compiler.emacs emacs互換のエラーメッセージを有効にします。 false
build.compiler.fulldepend 完全な依存性検査を有効にします。Jikesのマニュアルの +Fスイッチを参照してください。 false
build.compiler.pedantic 詳細な警告を有効にします。 false
build.compiler.warnings
推奨されません。 代わりに<javac>nowarn属性を使ってください。
警告メッセージを無効にしません。 true

Jvc 注意

間違って<javac>を呼び出す前に、 build.compiler.jvc.extensionsプロパティを設定することがない限り、 JvcはMicrosoft拡張を有効にします。


Copyright © 2000-2004 The Apache Software Foundation. All rights Reserved.

[訳注:これは西野 亨、宮本信二の訳を参考に、横田聡が翻訳しました。日本語訳に対するコメントがあれば report@jajakarta.orgに送ってください]