2

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

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

具体的.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>

通用.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 中设置。

4

2 回答 2

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));
于 2012-08-03T08:04:46.007 回答
0

蚂蚁手册提到

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

很确定这build.rc本地的,并且仅在目标范围内有效。所以在目标执行后我们无法访问它。

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

于 2012-08-02T13:28:16.187 回答