何故eclipseではScalaもJavaもビルドできるのか

比較的新参の僕は知る由もないが、「その昔はシェルスクリプトでビルドをしていてだな・・・クラスパスを通すのが非常に大変じゃった」という旨の話を先日聞いた。それいつの時代なのだろうか・・・全く想像できない。
eclipseでボタンぽちぽちしてビルドする僕にはまるで分からない世界だが、そのまま放置するのも気持ち悪く、その辺りを調べてたのでまとめておく。

プロジェクト・ネーチャーの定義

eclipseJavaだけでなく、ScalaClojureC++等の好きな言語のプロジェクトを作って、その言語をコンパイル出来る。それはプロジェクトのネーチャーが定義されているからだ。ネーチャーとは、そのプロジェクトが何であるかを特徴付ける為の機能である。eclipseのプロジェクト配下にある.projectを開くと以下の記述を見つけることができる。

<projectDescription>
	...
	<natures>
		<nature>org.scala-ide.sdt.core.scalanature</nature>
		<nature>org.eclipse.jdt.core.javanature</nature>
	</natures>
</projectDescription>

ここを見ると、これがScalaプロジェクトであり、なおかつJavaプロジェクトであることが分かる。

ビルダーの定義

メニューからBuildをクリックしたとき、もしくは(Build Automaticallyにチェックを入れていれば)リソースが変更されたときにJavaScalaのコードのビルドを開始する。このとき、定義されたビルダーのビルドコマンドを順次実行している。.projectをもう1度見てみよう。

<projectDescription>
	...
	<buildSpec>
		<buildCommand>
			<name>org.eclipse.jdt.core.javabuilder</name>
			<arguments>
			</arguments>
		</buildCommand>
		<buildCommand>
			<name>org.scala-ide.sdt.core.scalabuilder</name>
			<arguments>
			</arguments>
		</buildCommand>
	</buildSpec>
	...
</projectDescription>

JavaのビルダーとScalaのビルダーが定義されている。この各ビルダーで定義されている処理が実際にビルド時に実行される。余談だが、JavaJavaBuilderクラスが、Scala(Scala IDE)はScalaBuilderクラスが定義されており、Incremental Build/Build All/Cleanしたときの処理がそれぞれ書かれている。

Javaのビルダーの挙動

Compilerクラスを読めば分かるはず。しかしまだ読み切れていない。どうやってJDKのバージョンが指定されているか、クラスパスの設定をどのように読み込むか、その辺りはまた別の機会に書く予定。