2012-07-11 124 views
0

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

我正在使用PigUnit示例直接从PigUnit网站。

我使用Ant脚本是在这里:如果我在该项目的工作目录运行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构建脚本在猪项目的父目录

<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文件以指定top_queries.pig文件相对于Pig项目的父目录的位置,例如

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

而是因为它从父一个不同的目录中运行ant下破坏这并不是最佳选择。

其他JUnit测试将从父目录正常运行,但PigUnit始终引发相同的FNF异常。我也试着用PigServer做一个简单的测试(加载/转储文件),并且PigServer测试的行为就像PigUnit一样。

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

回答

0

你有一个相对于你的猪档案的路径。所以如果你从项目的工作目录调用ant脚本,它应该可以工作。当您从父项目调用ant脚本时,现在相对路径是相对于父目录的。

当你调用此Ant任务

,你是正确设置目录属性,但仅更改$ {BASEDIR}属性的值,为后续的脚本,而不是实际junit任务运行时的工作目录。

我建议你使用dir属性,在junit任务硬设置工作目录(我想这就是你想要什么用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

+0

将dir属性添加到junit工作!改变$ {basedir}属性和更改工作目录之间的区别是关键;子版本现在使用它自己的文件夹作为工作目录,而不管从哪里调用子版本。非常感谢你! – user847352 2012-07-13 01:23:04