Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Ant在子目录中运行PigUnit_Ant_Junit_Hadoop_Apache Pig_Filenotfoundexception - Fatal编程技术网

使用Ant在子目录中运行PigUnit

使用Ant在子目录中运行PigUnit,ant,junit,hadoop,apache-pig,filenotfoundexception,Ant,Junit,Hadoop,Apache Pig,Filenotfoundexception,我的问题是从父目录通过ant运行PigUnit <junit printsummary="on" fork="true" haltonfailure="yes"> <jvmarg value="-Duser.dir=${basedir}"/> <classpath refid="junit.class.path" /> <formatter type="xml" /> <

我的问题是从父目录通过ant运行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>
我使用的是网站上的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脚本如下所示:

    <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构建脚本中使用这行代码远程调用脚本时

    <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 dir="${pig.dir}" target="main" inheritall="false" antfile="build.xml"/>

我得到一个FileNotFoundException:

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

java.io.FileNotFoundException“>java.io.FileNotFoundException:top_querys.pig(无此类文件或目录)
在java.io.FileInputStream.open(本机方法)
位于java.io.FileInputStream。(FileInputStream.java:138)
位于org.apache.pig.pigunit.PigTest.readFile(PigTest.java:273)
位于org.apache.pig.pigunit.PigTest.readFile(PigTest.java:269)
位于org.apache.pig.pigunit.PigTest.(PigTest.java:92)
在TopQueriesTest.testTop2Queries(未知源)

    <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,也会发生相同的FNF异常:
ant-f PigJavaTest/build.xml junit

    <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>
我帮助PigUnit查找top_querys.pig文件的解决方法是指定top_querys.pig文件相对于pig项目父目录的位置,例如

    <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>
PigTest test=new PigTest(“PigTestJava/top_querys.pig”,args);

    <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时,它会中断

    <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>
其他JUnit测试将从父目录正常运行,但PigUnit总是抛出相同的FNF异常。我还尝试使用PigServer进行简单测试(加载/转储文件),PigServer测试的行为与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时会引发此FileNotFoundException,我如何修复它?

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

    <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任务时,您正确地设置了dir属性,但这只会更改后续脚本的${basedir}属性的值,而不会更改junit任务运行时的实际工作目录

    <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>
我建议您在junit任务中使用dir属性来硬设置工作目录(我猜这就是您试图使用jvmarg选项所做的):

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


有关更多详细信息,请参见

将dir属性添加到junit已工作!更改${basedir}属性和更改工作目录之间的区别是关键;无论从何处调用子构建,子构建现在都使用自己的文件夹作为工作目录。非常感谢!
    <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>