質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.55%

multiple versions of ant detected in path for junit

受付中

回答 1

投稿 ・編集

  • 評価
  • クリップ 2
  • VIEW 2,307

gomo

score 26

Ant+JUnit+SeleniumでWEBアプリケーションのテストを書いてます。

アサーションがコケた時や例外時に出力にテスト中のURLを出力したいと思い、PlainJUnitResultFormatterを上書きました。

フォーマッター自体は期待通り動いているのですが、multiple versions of ant detected in path for junitというウォーニングが出ます。

下記のようなコマンドでテストを起動しています。
ant -f /Users/masamoto/Documents/repos/home/source/sites/selenium/build.xml -Dselenium.port=4444 -Dselenium.host=127.0.0.1 -Dinclude.path=/Users/masamoto/Documents/repos/home/source/sites/selenium/libs -Dsetting.path=/path/to/settings.yml -Dtest.class=jp.example.SomeTest -Dtest.methods=main

出力されるウォーニングは下記です。

test:
    [junit] WARNING: multiple versions of ant detected in path for junit
    [junit]          jar:file:/usr/local/Cellar/ant/1.9.4/libexec/lib/ant.jar!/org/apache/tools/ant/Project.class
    [junit]      and jar:file:/Users/masamoto/Documents/repos/home/source/sites/selenium/libs/apache-ant/ant.jar!/org/apache/tools/ant/Project.class

ant経由で実行するとant.jarが自動で含まれるのかと思って、build.xmlに記述してある${include.path}からant.jarを取り除くと今度はコンパイルがコケます。

compile:
    [javac] Compiling 18 source files to /Users/masamoto/Documents/repos/home/source/sites/selenium/build
    [javac] /Users/masamoto/Documents/repos/home/source/sites/selenium/src/jp/sunrisedigital/selenium/JunitFormatter.java:14: error: cannot access BuildException
    [javac] public class JunitFormatter extends PlainJUnitResultFormatter {
    [javac]        ^
    [javac]   class file for org.apache.tools.ant.BuildException not found
    [javac] 1 error

当然コマンドのjarをpathelementに指定してやると問題なく動きますが、他の環境に配布した時に微妙なので引数で渡すようにしました。
<pathelement location="${ant.jar.path}" />

ant -f /Users/masamoto/Documents/repos/home/source/sites/selenium/build.xml -Dselenium.port=4444 -Dselenium.host=127.0.0.1 -Dinclude.path=/Users/masamoto/Documents/repos/home/source/sites/selenium/libs -Dsetting.path=/path/to/settings.yml -Dtest.class=jp.example.SomeTest -Dtest.methods=main -Dant.jar.path=/usr/local/Cellar/ant/1.9.4/libexec/lib/ant.jar

これでウォーニングも消え、ちゃんと動くのですが、よくあるシチュエーションだと思うのでなんかもっとスマートな解決策があるような気がしたので質問させていただきました。よろしくお願いします。


build.xmlの内容をアップしておきます。
<?xml version="1.0" encoding="UTF-8" ?>
<project name="sunrise.selenium" default="clean" basedir=".">
    <description>
        Seleniumのテスト郡
    </description>
    <property name="path.build" location="build"/>
    <path id="test.classpath">
        <pathelement location="${path.build}" />
        <dirset dir="${include.path}/jetty/resources"/>
        <fileset dir="${include.path}">
          <include name="**/*.jar"/>
        </fileset>
        <fileset dir="${include.path}/velocity">
          <include name="*.jar"/>
        </fileset>
        <fileset dir="${include.path}/apache-ant">
          <include name="*.jar"/>
        </fileset>
    </path>
    <target name="init">
        <!-- Create the time stamp -->
        <tstamp/>
        <mkdir dir="${path.build}"/>
    </target>
    <target name="compile" depends="init" description="compile the source" >
        <javac srcdir="src" destdir="${path.build}" includeAntRuntime="no" encoding="utf-8" debug="true" debuglevel="lines,vars,source">
            <classpath refid="test.classpath" />
        </javac>
    </target>
    <target name="test" depends="compile" description="test the source">
        <junit fork="yes" haltonfailure="yes">
            <jvmarg value="-Dselenium.host=${selenium.host}"/>
            <jvmarg value="-Dselenium.port=${selenium.port}"/>
            <jvmarg value="-Dsetting.path=${setting.path}"/>
            <test name="${test.class}" unless="test.methods" />
            <test name="${test.class}" methods="${test.methods}"  if="test.methods" />
            <formatter classname="jp.expample.selenium.JunitFormatter" usefile="false" />
            <classpath refid="test.classpath" />
        </junit>
    </target>
    <target name="clean" depends="test" description="clean up" >
        <delete dir="${path.build}"/>
    </target>
</project>
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

+1

Selenium込みでは確認していませんがご容赦ください。


Antのライブラリーは通常コンパイルには使用しないので、コンパイル時のclasspathには含まれません。よって、個別に指定する必要があります。
また、実行時のclasspathにはランタイムとしてのAntライブラリーが設定されるので、かぶってしまいます。

というわけで、Antのライブラリー参照は、compileターゲットだけで使用できるように、testターゲットで使用するclasspathrefとは別に定義しておくのが良いのではないかと思います。


■■■■■■■■■■■■■■■■■■■■
追記(2014-12-12): すみません、改めて確認したところ、
単にinclude.pathからantを除去してjavacタスクのincludeAntRuntime="yes"を設定すれば、下記と同じことになるようです。
これで上手く行けば、こちらの方が適切な方法かと思います。
(最初に確認したときはこれでは上手く行かなかったのですが...)

参考にされた方には、大変申し訳ありません。
■■■■■■■■■■■■■■■■■■■■

<!-- 略 -->
    <path id="test.classpath2">
        <fileset dir="${include.path}/apache-ant">
            <include name="*.jar" />
        </fileset>
    </path>
<!-- 略 -->
        <javac srcdir="src" destdir="dst" includeAntRuntime="no"
            encoding="utf-8" debug="true" debuglevel="lines,vars,source">
            <classpath refid="test.classpath" />
            <classpath refid="test.classpath2" />
        </javac>
<!-- 略 -->

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2014/12/09 18:05

    回答ありがとうございます!
    今ちょっと別案件に追われてるので、近々確認してみます。

    キャンセル

  • 2014/12/12 23:20

    改めて確認してみたら、ちょっと勘違いしていたようで、最初の回答よりも追記の方が適切かもしれません。
    上手くいきましたら、ご報告いただければ幸いです。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.55%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる