ふたつの川うるおう日記
2006-06-13 (Tue)
_ [Seasar][Java] Maven2 with Ant Tasksでリリースファイルまで作成 + libフォルダ不要
Maven 2.x Plug-in for Eclipseでリポジトリにjarファイルがあるのにいちいちリリース用にlibフォルダにjar置くのがどうなのかなって思ったのと、ant distが面倒なのでmvn clean deployで全部やりたくてがちゃがちゃいじってたらデキターーー!!仕組みはmavenからantlib使ってbuild.xmlを呼び出してます。こうするといろいろうれしいことが。
- mvn clean deploy だけでリリース用zipファイル作成までOK
- build.xmlでバージョン定義不要
- pom.xmlから引き継ぎます
- libフォルダ不要
- リポジトリからpom.xmlに書いてあるバージョンのjarファイルを自動でコピー
- 特定のMavenのscopeのjarすべて持ってくる設定可能
- 特定のjarだけ持ってくる設定可能
- build.xmlに正規表現で書くので1回書けばバージョン変わってもメンテ不要
- S2Directoryではcommons-codecだけパッケージングすることにしました
作ったやつは、S2Directoryのリポジトリにコミットしてありますので、興味がある方はご参考までにどうぞ。ただ、S2Directoryで試しに実行しても、まだApacheDSをテストケースから起動出来てないのでまず確実にTest Faildしちゃいます・・・。別途ApacheDSを起動して初期ツリーを作っておけばちゃんとSuccessします(僕の環境)。。。ApacheDSがRCになってから起動する方法がえらい面倒になったみたいでまだ解読できていません(汗。
あと、注意点が一つあって、1つのプロジェクトに複数モジュールがある場合、examplesなどのjarファイルをパッケージングする必要のないモジュールを除いて、一番最後に実行されるモジュールのpom.xmlからbuild.xmlを呼び出さないといけません。これは、先にパッケージングしたいモジュールがMavenでコンパイルされてjarファイルが作成されていないと、リリース用zipファイルに含めることが出来ないからです。親玉のpom.xmlに特定のphaseだけ一番最後に実行するといったオプションが無さそうだったのでこうなっちゃいました。
というわけで、Maven、Ant(実はこっちも)初心者だったのが、だいぶ詳しくなりました。これもS2AnA、S2Dao、S2Containerなどに良く考えられた設定が既にあったお陰ですヽ(´ー`)ノ。あと、maven.runtime.classpathを渡す方法は、gokingの日記さんで知りました。
以下、pom.xmlとbuild.xmlから関連するところの抜粋です。
- s2-directory/pom.xml
- 呼び出し元pom.xml
- モジュールが1個しかない場合は、/pom.xmlにantのdirオプション無くして書けばOK
... 省略 ...
<plugin>
<inherited>false</inherited>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<phase>install</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<ant target="dist" dir="../" antfile="build.xml">
<property refid="maven.runtime.classpath" name="mvn.dependency.classpath"></property>
</ant>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
... 省略 ...
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-artifact-ant</artifactId>
<version>2.0.4</version>
<scope>runtime</scope>
</dependency>
... 省略 ...
- build.xml
<project name="s2directory" default="dist" basedir="." xmlns:artifact="urn:maven-artifact-ant">
<!-- Please run "mvn clean deploy". -->
<target name="initTaskDefs">
<typedef resource="org/apache/maven/artifact/ant/antlib.xml" uri="urn:maven-artifact-ant">
<classpath>
<pathelement path="${mvn.dependency.classpath}"/>
</classpath>
</typedef>
<artifact:pom file="pom.xml" id="maven.project"/>
<property name="ver" value="${maven.project.version}"/>
<artifact:dependencies filesetId="dependency.fileset" verbose="true" useScope="compile">
<pom refid="maven.project"/>
</artifact:dependencies>
<property name="dependency.commons-codec" value="commons-codec*.jar"/>
</target>
<target name="dist" depends="initTaskDefs">
<mkdir dir="target"/>
<copy todir="s2-directory/target/lib" flatten="true">
<fileset refid="dependency.fileset"/>
</copy>
<zip zipfile="target/s2-directory-${ver}.zip">
<zipfileset prefix="s2directory" dir=".">
<exclude name="**/target/**"/>
<exclude name="*.log"/>
</zipfileset>
<zipfileset prefix="s2directory/lib" dir="s2-directory/target">
<include name="s2-directory-${ver}.jar"/>
<include name="s2-directory-${ver}-sources.jar"/>
</zipfileset>
<zipfileset prefix="s2directory/lib" dir="s2-directory/target/lib">
<include name="${dependency.commons-codec}" />
</zipfileset>
<zipfileset prefix="s2directory/resources" dir="s2-directory/src/test/resources">
<include name="directory.dicon"/>
<include name="directorydao.dicon"/>
<include name="log4j.properties"/>
</zipfileset>
</zip>
</target>
</project>
_ [Seasar][Java] S2Directory用Mavenリポジトリ
というわけで、S2DirectoryをSeasarのMavenリポジトリにあげました。と言ってもまだSNAPSHOTしかありません。ApacheDSのテスト用起動コードを書いたら0.3として一度リリースします。当初の目標と違ってますが気にしない気にしない・・・。
_ [大学] 図書委員(選書員)
選書員になりました。購入して欲しい本を選ぶらしいです。ここ数年より前はまったく本を読む習慣が無かった僕が選んで良いいのかな。いっぱい本を読んでる人と話すとその読書量の浅はかさが露呈します(汗。。。
ちなみに購入して欲しい本を選ぶと言っても、どうやら学科内の要望を取りまとめていついつまでに出して欲しいといった感じみたいです。というわけで、読書好きな方、会った時にでも良い本・欲しい本教えてくださいな。
そうそう、生協の書籍コーナーの読者アンケートにうちの学科で唯一書きまくってる人が1人いるんだけど、その人誰か紹介してくれませんかー?
そんなことより明日のゼミの準備してないーー。



すばらしい!<br>これでリリースがまた一段と自働化されて、いい感じです。<br>ふたがわさんはもうMaven2を使いこなしていますね。
どうもです。S2AnAが触るきっかけでした。<br>本当は変数の再定義をするような感じで、initTaskDefsタスク内で全ライブラリをall.dependency.filesetに一度代入して、それを欲しいライブラリでフィルタしたdependency.filesetを定義すれば、distタスク内がさらに綺麗になるんですが、refidを使ったタグ内ではネストして別タグを定義できないらしいのでダメでした。