読者です 読者をやめる 読者になる 読者になる

Corredor

ウェブ、プログラミングの勉強メモ。

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 のバージョンはあくまで例。

  • PATHC:\jdk1.7.0\bin;… (後略)
  • JAVA_HOMEC:\jdk1.7.0

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 自身は自分がどこに存在しているか分からないのだろうか?

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

他に見たもの