0

私の問題は、親ディレクトリから ant を介して PigUnit を実行することです。

PigUnitのサイトから直接出てきた PigUnit の例を使用しています。

私が使用しているantスクリプトは次のとおりです。

    <junit printsummary="on" fork="true" haltonfailure="yes">
        <jvmarg value="-Duser.dir=${basedir}"/>

        <classpath refid="junit.class.path" />
        <formatter type="xml" />
        <batchtest todir="${test.report.dir}">
            <fileset dir="${test.dir}">
                <include name="**/*Test*.java" />
            </fileset>
        </batchtest>
    </junit>
</target>

プロジェクトの作業ディレクトリで ant を実行すると、このスクリプトは問題なく動作します。ただし、Pig プロジェクトの親ディレクトリにある ant ビルド スクリプトで、このコード行を使用してスクリプトをリモートで呼び出すと、

    <ant dir="${pig.dir}" target="main" inheritall="false" antfile="build.xml"/>

FileNotFoundException が発生します。

java.io.FileNotFoundException">java.io.FileNotFoundException: top_queries.pig (No such file or directory) at java.io.FileInputStream.open(Native Method) at java.io.FileInputStream.<init>(FileInputStream.java:138) at org.apache.pig.pigunit.PigTest.readFile(PigTest.java:273) at org.apache.pig.pigunit.PigTest.readFile(PigTest.java:269) at org.apache.pig.pigunit.PigTest.<init>(PigTest.java:92) at TopQueriesTest.testTop2Queries(Unknown Source)

この同じ FNF 例外は、親ディレクトリのコマンド ラインから ant を実行した場合にも発生します。 ant -f PigJavaTest/build.xml junit

PigUnit が top_queries.pig ファイルを見つけて、Pig プロジェクトの親ディレクトリに対する top_queries.pig ファイルの場所を指定できるようにするための私の回避策、たとえば

PigTest test = new PigTest("PigTestJava/top_queries.pig", args);

ただし、親ディレクトリとは異なるディレクトリから ant を実行すると壊れるため、これは最適ではありません。

他の JUnit テストは親ディレクトリから正常に実行されますが、PigUnit は常に同じ FNF 例外をスローします。また、PigServer (ファイルのロード/ダンプ) で簡単なテストを実行しようとしましたが、PigServer テストは PigUnit と同じように動作しました。

親ディレクトリから ant を呼び出すと、この FileNotFoundException がスローされるのはなぜですか? どうすれば修正できますか?

4

1 に答える 1

0

豚ファイルへの相対パスがあります。したがって、プロジェクトの作業ディレクトリから ant スクリプトを呼び出すと、動作するはずです。親プロジェクトから ant スクリプトを呼び出すと、相対パスは親ディレクトリからの相対パスになります。

ここで Ant タスクを呼び出すと、dir プロパティが正しく設定されますが、junit タスクが実行されたときの実際の作業ディレクトリではなく、後続のスクリプトの ${basedir} プロパティの値のみが変更されます。

junit タスクで dir 属性を使用して作業ディレクトリをハード設定することをお勧めします (それが jvmarg オプションでやろうとしていることだと思います):

<junit printsummary="on" fork="true" haltonfailure="yes" dir="${basedir}">
    <jvmarg value="-Duser.dir=${basedir}"/>

    <classpath refid="junit.class.path" />
    <formatter type="xml" />
    <batchtest todir="${test.report.dir}">
        <fileset dir="${test.dir}">
            <include name="**/*Test*.java" />
        </fileset>
    </batchtest>
</junit>

詳細については、 http://ant.apache.org/manual/Tasks/junit.htmlを参照してください。

于 2012-07-12T10:37:37.737 に答える