【问题标题】:Programmatically retrieve returncode from ant-task以编程方式从 ant-task 检索返回码
【发布时间】:2012-08-02 13:16:40
【问题描述】:

在以编程方式检索返回码时遇到问题...以下文件。 (确实删掉了一些公司特有的东西)。我有 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 并尝试在目标内部分配像 &lt;var name="returnCode" value="${build.rc}"/&gt; 这样的值。没跑……

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

【问题讨论】:

    标签: java ant


    【解决方案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));
    

    【讨论】:

      【解决方案2】:

      ant manual mentions that

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

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

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

      【讨论】:

      • ain'get macrodef既没有取消设置运行:(你能发布相应文件的任何完整代码吗?(general.xml或specific.xml..)
      猜你喜欢
      • 2015-07-06
      • 2012-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-04
      • 1970-01-01
      • 2012-11-01
      • 2012-01-30
      相关资源
      最近更新 更多