Ant の javac タスクで compiler="extJavac" を選んだときの挙動

Ant の javac タスクで compiler="extJavac" を選んだときの挙動がよく分かっていないので書いてみる。

状況・サンプルコード

Eclipse 上から build.xml を実行し、プロジェクトをコンパイルする javac タスクを呼ぶ、という使い方をする。

build.xml はこんな感じにしておく。

<?xml version="1.0" encoding="UTF-8"?>
<project name="NeosProject" default="Main" basedir=".">
  <dirname property="base" file="${ant.file}"/>
  <target name="Main" description="ワークスペースをコンパイルする">
    <javac srcdir="${base}/src" destdir="${base}/dest" encoding="UTF-8" includeantruntime="false" debug="yes" compiler="extJavac">
      <classpath>
        <fileset dir="${base}/lib">
          <include name="*.jar"/>
        </fileset>
      </classpath>
    </javac>
  </target>
</project>

そして、以下の環境変数を設定しておかないといけない。パスは Windows の場合で、JDK のバージョンはあくまで例。

Eclipse 上では「ワークスペースと同じ JRE で実行」を選択しておく。このワークスペースの JRE は上の JDK を使用している。

これらの設定を守らないとどうなるか

上のコードは、我がプロジェクトに古くから伝わる秘伝のソース (コード) を引き継いだもので、compiler="extJavac" が何を意味するのか、環境変数 JAVA_HOME がどういう理屈で必要なのかがよく分かっていない。

もし compiler="extJavac" を書かないと、「ワークスペースと同じ JRE で実行」を選択しているにも関わらずこれとは違う JDK でコンパイルが行われるような動作をする。一方、環境変数 JAVA_HOME を指定しないと、コンパイラが見つからないよ的なエラーが出る。

かなり我がプロジェクトの開発環境に依存した話だとは思うが、これらがどのように作用して動いているのかがよく分かっていない。

compiler="extJavac" とは何だ?

compiler="extJavac" について調べてみたところ、以下のようなリファレンスの記事ぐらいしか日本語の文献がなかった。

compiler

コンパイラの実装に使います。もしこの属性が設定されていなければ、build.compilerプロパティの値になり、設定されていれば、それが使われます。
他には、現在のVMのデフォルトコンパイラが使われます。

  • extJavac (それ自身のJVMの中でmodernかclassic のどちらかで実行されます)

…うーん、これってどういう解釈になるんだろう?

Eclipse では「ワークスペースと同じ JRE で実行」を選択しているわけだから、Ant の VM は (上の例でいくと) C:\jdk1.7.0 で動いているはずだ。build.compiler プロパティなんて設定していないので、compiler="extJavac" 指定があろうとなかろうと、動作する VM は同じになりそうなのに、実際には実行される JDK が異なっているようなのである。

で、compiler="extJavac" と書いたときに、環境変数 JAVA_HOME が予めないと正しく動作しない理由も分からない。動作している VM 自身は自分がどこに存在しているか分からないのだろうか?

色々分からないので、何が起こっているか分かる人は教えてください。

他に見たもの

  • ANT_HOME : Antがインストールされているディレクトリを設定します。
  • JAVA_HOME : JDKがインストールされているディレクトリを設定します。
  • PATH : Antの実行ファイルの場所を追加する必要があります。

Ant が c:\ant\ にインストールされているとして、 次の環境(変数)を設定します:

  • set ANT_HOME=c:\ant
  • set JAVA_HOME=c:\jdk1.2.2
  • set PATH=%PATH%;%ANT_HOME%\bin

(javac タスクや rmic タスクといった) JDK の機能が必要な場合 JDK 1.1 では JDK の classes.zip ファイルをクラスパスに追加しなければなりません; JDK 1.2 や JDK 1.3 では tools.jar を追加しなければなりません。 Ant で提供されるbinディレクトリにあるスクリプトは、 環境変数JAVA_HOMEが設定されている場合、 必要なJDK クラスを自動的に追加します。