如何在Ant的build.xml文件中设置环境变量

3
我想在我的build.xml目标中设置一个环境变量。
<target name="run-tenantManagement" depends="jar">
   <property name="SIMV3.1" value="${SIMV3.1}" />
    //now here i want to do something like setenv SIMV3.1 true
</target>

在我的Java代码中,我想使用以下方式访问它:

if("true".equals(System.getenv("SIMV3.1")){
//do something
}

请您提供建议。我已经尝试了许多方法,但都没有成功。此外,由于该框架是基于testng的,所以没有main()方法,测试用例是使用testNG调用的。


你不能。为什么?系统参数的原因吗? - SMA
由于环境变量会传播到子进程,这正是我需要的行为(将值传递给通过“junit”任务启动的Ant启动的JUnit运行器运行的回归测试调用的进程)。进程可以通过setenv()(系统调用)修改其环境,这就是shell修改其传递给子进程的环境的方式。Ant应该公开这一点,但看起来可能没有。环境变量也适用于非Java进程。 - neuralmer
3个回答

2
你的程序是如何运行的?如果使用fork的exec,则可以将新环境传递给它。参考链接:https://ant.apache.org/manual/Tasks/exec.html。以下是页面上的示例:
<exec executable="emacs">
  <env key="DISPLAY" value=":1.0"/>
</exec>

考虑以下 build.xml 文件。
<?xml version="1.0"?>
<project name="MyProject" default="myjava" basedir=".">
  <target name="myjava">
    <!--default , if nothing comes from command line -->
    <property name="SIMV3.1" value="mydefaultvalue"/>

    <echo message="Value of SIMV3.1=${SIMV3.1}"/>
    <java fork="true" classname="EnvPrint">
      <env key="SIMV3.1" value="${SIMV3.1}"/>
    </java>
  </target>
</project>

以及小型Java程序

public class EnvPrint {
    public static void main(String[] args) {
        System.out.println(System.getenv("SIMV3.1"));
    }
}

无需任何命令行:

$ ant
Buildfile: C:\build.xml

myjava:
     [echo] Value of SIMV3.1=mydefaultvalue
     [java] mydefaultvalue

在命令行中使用一些参数:

$ ant -DSIMV3.1=commandlineenv
Buildfile: C:\build.xml

myjava:
     [echo] Value of SIMV3.1=commandlineenv
     [java] commandlineenv

我正在使用 ant -DSIMV3.1=true <targetName> 运行。 - Sammidbest
在我的情况下,我有几个目标需要同一个变量,我不想在每个实例中都显式地添加它(DRY)。 - neuralmer

1

不可变性:在Ant中,属性是不可变的:

<property name="env.foo" value="your value goes here"/>

无法工作。

可变性: 但是变量是可变的,所以这样可以工作:

<variable name="env.foo" value="your value goes here"/>

修改后的代码:
<target name="run-tenantManagement" depends="jar">
    <variable name="env.SIMV3.1" value="${SIMV3.1}"/>
</target>

2
如果我尝试这样做,就会出现以下错误:问题:无法创建任务或类型变量 原因:名称未定义。 操作:检查拼写。 操作:检查是否声明了任何自定义任务/类型。 操作:检查是否进行了任何<presetdef>/<macrodef>声明。 - Sammidbest

0

是的,你可以这样做。将你的变量放在一个build.properties文件中,并在你的build.xml中引用它。然后你就可以传递这个变量了...但我认为如果你需要更好地控制多个环境配置,最好使用Maven Profiles

build.properties

var=${val};

build.xml


 <property file="build.properties"/>     
 <property name="var" value="${val}"/>
   <target name="init">
      <echo>${var}</echo>
  </target>

CLI


 ant -Dvar=value

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接