Mavenにはまる

Mavenにはまった一日、でした(T_T

恐らく、Maven使いなら皆経験があると思われる、Eclipseだとテスト動くのにMavenだと動かない!という状態で数時間はまる。

今回はまったのはXMLパーサ。

Mavenでテストを実行すると、なぜかSAXParserが見つからないというエラーが発生する。
試行錯誤した結果、maven-surefire-pluginに以下のようにchildDelegationをtrueに設定することで、とりあえず正常に実行されるようになった。ただしこれが正しいのかまだ謎。デフォルトで動かないのはうちの環境が特殊なのだろうか?
明日、もうちょい調査するか。。。

訂正。書き間違い。childDelegationをfalseに設定することで、でした。さらに、childDelegationはデフォルトではfalseなので普通は設定は不要。どうも親POMでtrueと設定していたため、falseと設定しないと動かなかった模様。

<project>
  [...]
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <configuration>
          <childDelegation>false</childDelegation>
        </configuration>
      </plugin>
    </plugins>
  </build>
  [...]
</project>


おまけ

エラーメッセージを読んでも何が悪いのかさっぱり分からなかったので、Eclipseのデバッガで追って解析していました。
テストをデバッグするには、テストの起動時のVM引数にデバッグオプションを渡す必要があります。

maven-surefire-pluginでどうやるかというと、以下のようにargLineタグを追加して、そこにでデバッグオプションを記述してやればOK(改行はしちゃだめなので注意)

<project>
  [...]
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <configuration>
          <argLine>・・・</argLine>
        </configuration>
      </plugin>
    </plugins>
  </build>
  [...]
</project>


もうひとつおまけ

プロジェクトを複数に分けていると、他のテストプロジェクト内のクラスに依存する場合がたま〜にあります。
そう依存しないように設計するのが正しい解だと思うけど、その場合どうすりゃいいんだと。
試してはいないけど、以下のFAQに書かれているのをたまたま見つけた。

http://maven.apache.org/plugins/maven-surefire-plugin/faq.html

testクラスのJARを作って、そいつに依存関係を定義することができるらしい。

追記

試したら無事にちゃんとできました。