1
votes

I have an Ant buildfile that imports the following at the top of the file:

<project name="..." ...>
    <property file="build.properties"/>
    ...

In the project root I have two properties files: build.properties and special-config.properties. I am defining a target that needs to read the following property out of special-config.properties:

always.ask=true

So the target needs to be something like this (just keep in mind that build.properties was already set as the property file long before this target ever executes):

<target name="exec-special-logic">
    <!-- Somehow read special-config.properties#always.ask and set it to a local variable... -->
</target>

But I am ansure of how to load this 2nd property file and make its properties (such as always.ask) available to Ant. Thanks in advance.

1

1 Answers

3
votes

You can read properties from as many different files as you like, so you could have

<property file="build.properties"/>
<property file="build.properties.part2"/>

And so on. In Ant the first value set for a property sticks - properties are quietly immutable. Hence if you have:

<property name="my.prop" value="one" />

somewhere in the first file and

<property name="my.prop" value="two" />

later - perhaps in the second file, the property will have the value "one" for the duration of the build.

A feature of recent versions is that properties can be localised to an execution block - this lets you "get around" the immutability. Here's an example lifted straight from the docs for the Ant local task:

<property name="foo" value="foo"/>

<target name="step1">
    <echo>Before local: foo is ${foo}</echo>
    <local name="foo"/>
    <property name="foo" value="bar"/>
    <echo>After local: foo is ${foo}</echo>
</target>

<target name="step2" depends="step1">
    <echo>In step2: foo is ${foo}</echo>
</target>

outputs

step1:
     [echo] Before local: foo is foo
     [echo] After local: foo is bar

step2:
     [echo] In step2: foo is foo