EclipseのWTPでApache Ivy v.s m2eclipseその2 - Ivyってどうよ

さて。では、同じようなことをIvyでやってみたいと思います。

  1. Eclipse上でWTPの動的Webプロジェクトを作成する
    1. トクダン変わったことも無く普通にウィザードで作成しますが、とりあえずプロジェクト名は「ivy_test」にします
  2. Ivyをここからダウンロードして解凍
    1. http://ant.apache.org/ivy/download.cgi
  3. 以下のライブラリをWEB-INF/libにコピー*1
    1. ivy-2.0.0-beta2.jar
    2. ivy-core-2.0.0-beta2.jar
    3. commons-cli-1.0.jar
    4. commons-codec-1.2.jar
    5. commons-httpclient-3.0.jar
    6. commons-lang-1.0.jar
    7. commons-logging-1.0.4.jar
    8. commons-vfs-1.0.jar
    9. jsch-0.1.25.jar
    10. oro-2.0.8.jar
  4. 以下のような「ivy.xml」をプロジェクトの直下に作成
<ivy-module version="2.0">
    <info organisation="org.chiba" module="ivy_test" />
    <dependencies>
        <dependency org="org.apache.struts" name="struts-core" rev="1.3.9" />
    </dependencies>
</ivy-module>
  1. 以下のような「build.xml」をプロジェクトの直下に作成
<project xmlns:ivy="antlib:org.apache.ivy.ant" name="ivy_test" default="resolve" basedir=".">
	<path id="ivy.lib.path">
		<fileset dir="${basedir}/WebContent/WEB-INF/lib" includes="*.jar"/>
	</path>

	<taskdef resource="org/apache/ivy/ant/antlib.xml" 
		uri="antlib:org.apache.ivy.ant" 
		classpathref="ivy.lib.path"/>
	
	
	<target name="resolve" description="--> retrieve dependencies with ivy">
		<ivy:retrieve />
	</target>
</project>
  1. 「resolve」タスク実行
    1. こんなエラーが出るも何やら正常終了
[Error] :43:30: cos-nonambig: "":license and WC[##any] (or elements from their substitution group) violate 
"Unique Particle Attribution". During validation against this schema, ambiguity would be created 
for those two particles.

・・・

予想していたのですが、

ライブラリがどこにダウンロードされたのか分かりません

まぁ、クイックスタートを読んだときから予想していたので驚きはしませんでしたが。

さて。どこにいったものかと思ってプロジェクトの表示をリフレッシュしてよぉく見てみたら、

プロジェクト直下にlib/ディレクトリができている

ではありませんか。

なるほど。

確かに、ここにstruts-core-1.3.9.jarと、それが依存するライブラリがダウンロードされています。依存性の推移的解決もできるみたいですね。このlibディレクトリからWEB-INF/libディレクトリにコピーするようなタスクを追加してあげればいけそうです。

jarプロジェクトの場合にどうやってクラスパスを通すか

がまためんどくさそうですけど、まぁそれはそれでなんとかなりそうです。ダミーの動的Webプロジェクトを作ってそのWEB-INF/libを参照するとかしてもいいですし。

話は変わって、以前の日記に書いた、

  • 基本はmavenリポジトリからライブラリを取得、mavenに登録されていないライブラリ(djUnitとか、Struts-Layoutとか)はローカルまたは共有から取得

的なことは、resolverの設定とかでなんとかなりそうな気はするのですが、mavenでいうところのcompileとかのスコープ的なものは無いものでしょうか。

さっきのstrutsの例だと、servlet-apiとか「provided」にしたいようなライブラリもいくつかダウンロードされてくるのがちょっと気になるところです。後は、

  • ソースのダウンロードとか
  • JavaDocのダウンロードとか

ちょいちょい気になるところはありますが、

まぁそれはそれとして

結論から言うと、私が現在ant+mavenで行っているようなことは、ant+ivyで行う方が楽なような気がします。

だって、コマンドでmavenプロジェクトを作ってeclipseにインポートして設定ファイルをごにょごにょいじって動的プロジェクト化して・・・とかそもそもが面倒くさいですし。

しかし、m2eclipseも思ったよりもだいぶ良くなっているような気がします。ant+ivyだと、「動的Webプロジェクトを作って、ivy関連のjarにクラスパスを通して、ivy.xmlを書いて、build.xmlを書いて・・・」と、まぁ全部IDE上でできるものの色々手作業がある訳ですが、m2eclipseだと今やウィザード一発でプロジェクトが出来ます。ライブラリの追加もGUIベースで、ソースやJavaDocも(mavenリポジトリにあれば)ダウンロードできます。

ちょいちょい不安定ですけど。

そんな訳で、m2eclipseの勝ち・・・と、言いたいところですが、struts-layoutとかdjunitflexとか、

的なものを扱おうと思うと、やっぱm2eclipse+antになるので、そういうケースではant+ivyの方がシンプルでいいような気がします。

*1: ほんとは、この手のビルドやテストに固有のものは、本番にデプロイしないようにWEB-INF/libには入れずに別の手法でクラスパスを通した方がいいと思いますが、ここではちょっとずぼらします。