以编程方式检索返回代码有问题...跟随文件。 (确实削减了一些公司特定的东西)。我有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中设置。
答案 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)
属性范围存在于Apache Ant的各种“块”级别。这些包括目标以及Parallel和Sequential任务容器(包括Macrodef主体)。
非常确定build.rc
是本地,并且仅在目标范围内有效。因此,在目标执行后我们无法访问它。
尝试定义全局属性(使用<property>
元素)并将java任务的结果代码分配给该属性。