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)

如果我从父目录中的命令行运行 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,我该如何解决?

4

1 回答 1

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

于 2012-07-12T10:37:37.737 回答