miau's blog?

社内の Maven2 リポジトリに djUnit を格納する

「maven2 djUnit」とかで検索して迷い込んでくる方がいらっしゃるようなので、ちゃんと書いておきます。基本は前書いた

Maven2 で外部 .jar を社内リポジトリに格納 - miau's blog?

と同じなので、同じ部分はさらっと流します。




実際試したバージョンは 0.8.3 だったんですが、先日 0.8.4 が出てたので、以下のバージョン記述は 0.8.4 に書き換えてます。

■超参考

たぶんこの辺の情報がなかったら Maven で djUnit 使えてなかった。感謝。

maven-surefire-plugin(djUnitを使用) - tanamonの日記
2008-04-16 - tanigonの日記

ちなみに tanigon さんてタイピングで有名な方ですね。同業者だとは知らなかった・・・。(勝手にプロのタイピストか何かかと思ってた・・・。)

■.jar の格納

jp.co.dgic.eclipse.jdt.djunit_3.4.x_0.8.4.zip をダウンロードして展開すると、中に djunit.jar が入ってるので取り出す。これが C:\temp\djunit.jar として置いているものとして。

(1) ローカルリポジトリに格納

mvn install:install-file -Dfile=C:\temp\djunit.jar -DgroupId=jp.co.dgic -DartifactId=djunit -Dversion=0.8.4 -Dpackaging=jar -DgeneratePom=true -DcreateChecksum=true


(2) 不要ファイル削除
djunit-0.8.4.jar.sha1、djunit-0.8.4.pom.md5、djunit-0.8.4.pom.sha1、../maven-metadata-local.xml は消す。
今回は pom も書き換えるから pom.md5 も消しちゃってます。

(3) SVN を使っているので、この時点で一旦格納。
djunit-0.8.4.jar、djunit-0.8.4.jar.md5、djunit-0.8.4.pom の 3 ファイルを http://xxx.xxx.xxx.xxx/svn/proj/maven2/jp/co/dgic/djunit/0.8.4 配下に置く感じ。

(4) djunit-0.8.4.pom の編集。
ここがポイント。Maven2 はせっかく推移的依存関係を解決してくれるんだから、djUnit が依存しているモジュールは jdUnit 側に情報として持たせたい。そんなわけで、djunit-0.8.4.pom はこんな感じに。

<?xml version="1.0" encoding="UTF-8"?>
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>jp.co.dgic</groupId>
<artifactId>djunit</artifactId>
<version>0.8.4</version>
<packaging>jar</packaging>
<name>djUnit</name>
<url>http://works.dgic.co.jp/djwiki/Viewpage.do?pid=@646A556E6974</url>
<dependencies>
<dependency>
<groupId>asm</groupId>
<artifactId>asm</artifactId>
<version>3.1</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>oro</groupId>
<artifactId>oro</artifactId>
<version>2.0.8</version>
<scope>runtime</scope>
</dependency>
</dependencies>
</project>

SVN を使っている場合は、ここで最終版をコミット。

(5) pom.xml 設定

で、djunit を使いたいプロジェクト側での設定はこんな感じ。

<project>
:
<build>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.4.2</version>
<configuration>
<argLine>-Djava.system.class.loader=jp.co.dgic.testing.common.DJUnitClassLoader -Djp.co.dgic.eclipse.virtualmock.usevirtualmock=true -Djp.co.dgic.eclipse.coverage.usecoverage=false -Djp.co.dgic.eclipse.project.source.dir="${project.build.sourceDirectory}" -Djp.co.dgic.eclipse.virtualmock.ignore.library=false</argLine>
<forkMode>always</forkMode>
<useSystemClassLoader>true</useSystemClassLoader>
</configuration>
</plugin>
</build>
<repositories>
<repository>
<id>in-house</id>
<name>in-house</name>
<url>http://xxx.xxx.xxx.xxx/svn/proj/maven2</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>jp.co.dgic</groupId>
<artifactId>djunit</artifactId>
<version>0.8.3</version>
<scope>test</scope>
</dependency>
</dependencies>
:
</project>

maven-surefire-plugin のオプションも djUnit 側の pom で持つことができればきれいなんだろうけど・・・それはどうしようもないってことでいいのかな?

本当は開発元の人がそれっぽく作ってくれると楽なんだけど・・・。

■ハマったところ

当初推移的依存関係を理解せずに (4) で asm や oro の scope を test にしちゃってたから、それなりにハマった気がする。ここに書くのは「asm や oro が対象プロジェクトの test に必要」という情報ではなく「asm や oro が djUnit の runtime(対象プロジェクトの test)に必要」という情報なわけで。scope は test じゃなくて runtime が正解と。

Maven - Introduction to the Dependency Mechanism

これについては Apache Maven 2.0入門 にも書いてたんだけど、唯一この本のなかで記述がわかりにくかった箇所で読み飛ばしてたんでした・・・。個別にレビュー書く機会なかったですが、いい本なので貼っておきます。

Amazon.co.jp の紹介ページ(アソシエイトあり)へ
Apache Maven 2.0入門 Java・オープンソース・ビルドツール - Amazon.co.jp


■BCEL も使えるように

実際には使わなかったので検証が不完全ですが、一応書いておきます。

Maven2 でハマったところいくつか - miau's blog? この辺で軽く書いたけど、djUnit と Cobertura とどちらも ASM を利用してるから何か競合とかしてるのかなー?と疑ってる時期がありまして。

djUnitバージョン情報 - dJWiki

バイトコード操作ライブラリを選択可能にした(BCEL or ASM)

 デフォルトのバイトコード操作ライブラリを「ASM」にしました。
 ASMは、Java5もサポートしています。
 BCELで、かつJava5のコードを実行したいときは、-noverifyオプションを付けて実行する必要があります。

 また、ASMとBCELが選択できることにより、バージョンの衝突をさけることができます。

         例)seasar2プロジェクトのS2StrutsUnitは、「ASM」ではなく「BCEL」を選択する

とのことなので、BCEL を使ってみたりもしました。この場合は、まず djunit.jar と同様 jcoverage-djunit.jar を社内リポジトリに追加しておいて。djunit-0.8.4.pom に

<dependency>
<groupId>org.apache.bcel</groupId>
<artifactId>bcel</artifactId>
<version>5.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>jp.co.dgic</groupId>
<artifactId>jcoverage-djunit</artifactId>
<version>1.0.5</version>
<scope>test</scope>
</dependency>

という記述を追加。

ベーシスト兼ソフトウェアエンジニアのブログ Mavenトラブル事例-site+jCoverage+ジェネリクスでユニットテストエラー

あたりを参考に、surefire の引数に

-Djp.co.dgic.eclipse.classloader.bytecodelibrary=BCEL -Dmaven.junit.fork=yes -noverify

をさらに追加したら動いた気がします。forkMode あるから fork はいらないかもしれないんですが、動作がいまいち不安定でよくわかりませんでした。

ところで本当は ASM を使う場合も BCEL の記述を djunit-0.8.4.pom に追加しておいたほうがいいんでしょうけど、余計なモジュール増やすのアレなので入れてません。こういう「オプションによってはこのモジュールが必要」ってのを pom で表すことはできないんですかね?(optional って記述がそれだと期待したんだけど、実は違ってたし。)
posted at 08:07:16 on 2009-02-17 by miau - Category: Java No Trackbacks - Permalink

TrackBack

このエントリにトラックバックはありません
現在トラックバックは受け付けていません。

Comments

No comments yet

Add Comments

現在コメントは受け付けていません。
お手数ですが、 こちら のコメント欄にでも記載していただければと思います。