naumcho
naumcho

Reputation: 19881

Passing a variable into ant

If I pass a variable to ant by doing

ant -Dsomething=blah

How can I refer to it in my build.xml? I tried @something@ and ${something} but neither seem to work.

Ultimately what I am trying to do is set some properties (versions) at compile time.

update: the problem of course turned out to be somewhere else - accepting the most complete looking answer with examples

Upvotes: 2

Views: 4913

Answers (3)

mtk
mtk

Reputation: 13709

${argsOne} works for me and is easily referenced if the invoking command is

ant -DargsOne=cmd_line_argument

Ant documentation also says so. This should work, try running with ant -debug and paste the output.

Upvotes: 0

David W.
David W.

Reputation: 107030

Don't you hate it when you over think these things:

<project name="test">
    <echo message="The value of foo is ${foo}"/>
</project>

Now, I'll run my program. Notice that I never defined a value for property foo in my build.xml. Instead, I'll get it from the command line:

$ ant -Dfoo=BAR_BAR_FOO

test:
     [echo] The value of foo is BAR_BAR_FOO

BUILD SUCCESSFUL
 time: 0 seconds

See. Nothing special at all. You treat properties set on the command line just like normal properties.

Here's where the fun comes in. Notice that I've defined the property foo in my build.xml this time around:

<project name="test">
     <property name="foo" value="barfu"/>
     <echo message="The value of foo is ${foo}"/>
</project>

Now watch the fun:

$ ant
test:
     [echo] The value of foo is barfu

BUILD SUCCESSFUL
 time: 0 seconds

Now, we'll set the property foo on the command line:

$ ant -Dfoo=BAR_BAR_FOO
test:
     [echo] The value of foo is BAR_BAR_FOO

BUILD SUCCESSFUL
 time: 0 seconds

See the command line overrides the value I set in the build.xml file itself. This way, you can have defaults that can be overwritten by the command line parameters.

Upvotes: 6

Brett Kail
Brett Kail

Reputation: 33936

It sounds like you want to do something like the following:

<mkdir dir="build/src"/>
<copy todir="build/src" overwrite="true">
  <fileset dir="src" includes="**/*.java"/>
  <filterset>
    <filter token="VERSION" value="${version}"/>
  </filterset>
</copy>

...which will cause your source to get copied, replacing @VERSION@:

public class a { public static final String VERSION = "@VERSION@"; }

...and then include build/src in your javac src.

That said, I don't recommend this approach since the source copy step is expensive, and it will undoubtedly cause confusion. In the past, I've stored a version.properties file in my package with version=x.y. In my Java code, I used Class.getResourceAsStream("version.properties") and java.util.Properties. In my build.xml, I used <property file="my/pkg/version.properties"/> so that I could create an output-${version}.jar.

Upvotes: 1

Related Questions