我们的商店在Java 6,7和8上设置了多个构建和测试环境(Jenkins,Ant 1.9.6(。仅在 Java 7 上,为了使我们的测试成功运行,我们需要添加 JVM 参数-XX:-UseSplitVerifier
。
我不能在junit
中使用condition
,所以我在init
任务中设置了一个布尔属性:
<condition property="usesplitverifier">
<equals arg1="${ant.java.version}" arg2="1.7" />
</condition>
在我的test
任务中,仅当该属性true
时,我才需要向junit
添加jvmarg
:
<echo message="usesplitverifier: ${usesplitverifier}" />
<junit printsummary="yes" haltonfailure="no" fork="yes" forkmode="once" tempdir="${build.dir}">
<jvmarg if="usesplitverifier" value="-XX:-UseSplitVerifier" />
...
</junit>
输出为:
[echo] usesplitverifier: true
BUILD FAILED
C:workspaceutilbuild.xml:141: jvmarg doesn't support the "if" attribute
我试图避免将ant-contrib添加到我们的构建/测试环境中。另外,我想避免向构建脚本添加更多目标(我正在尝试简化构建过程(。有没有另一种方法可能在这里起作用?
当我写这个问题时,我在另一个问题中找到了解决方案,这个问题因过于模糊而关闭。我决定发布这个问题以提供一个特定的用例。
if/除非命名空间可以在任何 Ant 命令中使用。就我而言,我需要将if
命名空间添加到项目中:
<project name="my-project" xmlns:if="ant:if" ...>
然后将条件放在jvmarg
上,如下所示:
<junit printsummary="yes" haltonfailure="no" fork="yes" forkmode="once" tempdir="${build.dir}">
<jvmarg if:set="usesplitverifier" value="-XX:-UseSplitVerifier" />
...
</junit>
在这种情况下if:set
工作的原因是,如果未1.7
${ant.java.version}
,则属性将保持未设置状态。
注意事项(在我的情况下可以接受(:
if/unless
命名空间仅在 Ant 1.9.1 之后可用。- 在 Ant 1.6 之前,
${ant.java.version}
返回编译 Ant 时使用的 JVM 版本。