在Ant的子目录中运行PigUnit

时间:2012-07-11 21:38:06

标签: ant junit hadoop apache-pig filenotfoundexception

我的问题是从父目录通过ant运行PigUnit。

我正在使用PigUnit网站上的PigUnit示例。

我使用的蚂蚁脚本在这里:              

    <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)

如果我从父目录中的命令行运行ant,也会发生同样的FNF异常: ant -f PigJavaTest/build.xml junit

我帮助PigUnit找到top_queries.pig文件以确定top_queries.pig文件相对于Pig项目的父目录的位置的解决方法,例如:

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

但这不是最佳选择,因为当从不同于父目录的目录运行ant时它会中断。

其他JUnit测试将从父目录正常运行,但PigUnit始终抛出相同的FNF异常。我还尝试使用PigServer进行简单的测试(加载/转储文件),PigServer测试就像PigUnit一样。

为什么从父目录调用ant时会抛出此FileNotFoundException,我该如何解决?

1 个答案:

答案 0 :(得分:0)

您有一个猪文件的相对路径。因此,如果从项目的工作目录中调用ant脚本,它应该可以工作。从父项目调用ant脚本时,相对路径现在是相对于父目录的。

当你在这里调用ant任务时,你正在设置dir属性,但这只会改变后续脚本的$ {basedir}属性的值,而不是junit任务运行时的实际工作目录。

我建议您在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