Sonatype版m2eclipseでUnit Testの実行ができない

Sonatype版m2eclipseは微妙に安定していない感じがしたので今までcodehaus版のm2eclipseを使っていたが、Ymirをいろいろな人に使ってもらうにあたって「昔のm2eclipseを使ってね」というのは酷なので、Sonatype版を再び試してみることにした。

するとなぜかEclipse上でのJUnitでのテストが実行できなくなった。調べてみたところ、どうやらEclipseのビルドパスで指定されているアウトプットフォルダがクラスパスに通っておらず、代わりにMavenのデフォルトの出力先であるtarget/classes, target/test-classesがクラスパスに通っているためにClassNotFoundExceptionが起きて実行に失敗しているようであった。

自分の手元ではプロジェクトのアウトプットフォルダをbuild/classes, build/test-classesにしている*1ため、Eclipse上でビルドしてもJUnitからは見えない状態になっていた。

この問題のworkaroundがm2eclipseのFAQに載っていた

結論から言うと、以下の記述をpom.xmlに加えることでプロファイルを追加し、

<project>
  ...
  <build>
    <outputDirectory>${basedir}/${target.dir}/classes</outputDirectory>
    <testOutputDirectory>${basedir}/${target.dir}/test-classes</testOutputDirectory>
  </build>

  <properties>
    <target.dir>target</target.dir>
  </properties>

  <profiles>
    <profile>
      <id>eclipse-folders</id>
      <properties>
        <target.dir>build</target.dir>
      </properties>
    </profile>
  </profiles>
  ...

その上で「eclipse-folders」プロファイルを使用するようにプロジェクトの設定を以下のように変更するとうまくいくらしい。

pom.xmlへの設定はルートプロジェクトのpom.xmlに書けば済むのだが、プロファイル適用のためのプロジェクト設定は全てのプロジェクトで行なわないといけないので面倒。でも仕方ないか。

*1:EclipseのアウトプットフォルダとMavenの出力先を一緒にしてしまうとコマンドラインでmvn clean等した際に変なことになってしまうのを避けるため