以编程方式从ant-task中检索返回码

时间:2012-08-02 13:16:41

标签: java ant

以编程方式检索返回代码有问题...跟随文件。 (确实削减了一些公司特定的东西)。我有2个文件,一个带有java-task的通用文件和一个特定的文件,它定义了sime属性和一个ant-task。

如何在执行java-test中获取build.rc?文件末尾的echo-message传递实际的返回码,但p.getProperty(“build.rc”)返回null。

specific.build.xml

<project basedir="../../../.." name="run-joblauncher">
     <property name="prop1" value="valProp1" />
     <ant antfile="./dev/script/general.xml" dir="${basedir}" target="RUN-MYCLASS" inheritAll="true"/>
</project>

general.xml

<project basedir="../../../.." default="RUN-MYCLASS" name="run-specifictest"> <target name="RUN-MYCLASS"> 
     <property name="returnCode" value="99"/>
     <target name="RUN-MYCLASS">            
          <java classname="my.company.class" fork="true" resultproperty="build.rc" failonerror="false">
                <arg value="${workdir}"/>
                <classpath>
                     <pathelement path="${java.class.path}"/>
                </classpath>
          </java>   
      </target> 
</project>

myJunitTest.java

public class TestAntScripts extends TestCase {

public void testMyAnt() throws IOException {

    File dir = new File("pathToSpecific.xml");

    Project p = null;
    try {
        File buildFile = new File(buildFileName);
        p = new Project();
        DefaultLogger consoleLogger = new DefaultLogger();
        consoleLogger.setErrorPrintStream(System.err);
        consoleLogger.setOutputPrintStream(System.out);
        consoleLogger.setMessageOutputLevel(Project.MSG_INFO);
        p.addBuildListener(consoleLogger);
        p.addBuildListener(new CustomBuildListener(this));
        p.fireBuildStarted();
        p.init();
        ProjectHelper helper = ProjectHelper.getProjectHelper();
        p.addReference("ant.projectHelper", helper);
        helper.parse(p, buildFile);
        p.fireBuildFinished(null);
    } catch (BuildException e) {
        p.fireBuildFinished(e);
        e.printStackTrace();
        System.err.println("AntRunner for buildfile " + buildFileName
                + " failed with Exception ");
    }

    String rc = p.getProperty("returnCode");
    assertEquals(0, Integer.parseInt(rc));

    }


public void taskFinished(String buildRc) {
    assertEquals(0, buildRc);   
    }
}

编辑:

如何为已定义的属性赋值?在java-target之外定义了一个var returnCode,并尝试在目标中分配<var name="returnCode" value="${build.rc}"/>之类的值。没跑'..

EDIT2: 添加了一个自定义的BuildListener并在那里抓取build.rc。

  @Override
  public void targetFinished(BuildEvent event) {

    if (event.getTarget().getName().trim().equalsIgnoreCase("RUN-MYCLASS")) {
        String buildRc = event.getTarget().getProject().getProperty("build.rc");    
        tester.taskFinished(buildRc, jobname);
    }

tester是我的JUnit-Test,它将在Constructor中设置。

2 个答案:

答案 0 :(得分:1)

添加了一个自定义BuildListener并在那里抓取build.rc。

@Override
public void targetFinished(BuildEvent event) {

if (event.getTarget().getName().trim().equalsIgnoreCase("RUN-MYCLASS")) {
    String buildRc = event.getTarget().getProject().getProperty("build.rc");    
    tester.setReturnCode(buildRc);
}

然后测试

assertEquals(0, Integer.parseInt(this.returnCode));

答案 1 :(得分:0)

ant manual mentions that

  

属性范围存在于Apache Ant的各种“块”级别。这些包括目标以及Parallel和Sequential任务容器(包括Macrodef主体)。

非常确定build.rc本地,并且仅在目标范围内有效。因此,在目标执行后我们无法访问它。

尝试定义全局属性(使用<property>元素)并将java任务的结果代码分配给该属性。