aboutsummaryrefslogtreecommitdiffstats
path: root/framework/src/ant/apache-ant-1.9.6/manual/properties.html
diff options
context:
space:
mode:
Diffstat (limited to 'framework/src/ant/apache-ant-1.9.6/manual/properties.html')
-rw-r--r--framework/src/ant/apache-ant-1.9.6/manual/properties.html399
1 files changed, 399 insertions, 0 deletions
diff --git a/framework/src/ant/apache-ant-1.9.6/manual/properties.html b/framework/src/ant/apache-ant-1.9.6/manual/properties.html
new file mode 100644
index 00000000..e42d3a2a
--- /dev/null
+++ b/framework/src/ant/apache-ant-1.9.6/manual/properties.html
@@ -0,0 +1,399 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<html>
+
+<head>
+ <meta http-equiv="Content-Language" content="en-us"/>
+ <link rel="stylesheet" type="text/css" href="stylesheets/style.css"/>
+ <title>Properties and PropertyHelpers</title>
+</head>
+
+<body>
+ <h1>Properties</h1>
+
+ <p>Properties are key-value-pairs where Apache Ant tries to
+ expand <code>${key}</code> to <code>value</code> at runtime.</p>
+
+ <p>There are many tasks that can set properties, the most common one
+ is the <a href="Tasks/property.html">property</a> task. In
+ addition properties can be defined
+ via <a href="running.html">command line arguments</a> or similar
+ mechanisms from outside of Ant.</p>
+
+ <p>Normally property values can not be changed, once a property is
+ set, most tasks will not allow its value to be modified. In
+ general properties are of global scope, i.e. once they have been
+ defined they are available for any task or target invoked
+ subsequently - it is not possible to set a property in a child
+ build process created via
+ the <a href="Tasks/ant.html">ant</a>, antcall or subant tasks
+ and make it available to the calling build process, though.</p>
+
+ <p>Starting with Ant 1.8.0
+ the <a href="Tasks/local.html">local</a> task can be used to
+ create properties that are locally scoped to a target or
+ a <a href="Tasks/sequential.html">sequential</a> element like
+ the one of the <a href="Tasks/macrodef.html">macrodef</a>
+ task.</p>
+
+ <h2><a name="built-in-props">Built-in Properties</a></h2>
+
+ <p>Ant provides access to all system properties as if they had been
+ defined using a <code>&lt;property&gt;</code> task. For
+ example, <code>${os.name}</code> expands to the name of the
+ operating system.</p>
+ <p>For a list of system properties see
+ <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/System.html#getProperties%28%29">the Javadoc of System.getProperties</a>.
+ </p>
+
+ <p>In addition, Ant has some built-in properties:</p>
+<pre><!-- TODO use <dl><dt><code>...</code></dt><dd>...</dd></dl> instead -->
+basedir the absolute path of the project's basedir (as set
+ with the basedir attribute of <a href="using.html#projects">&lt;project&gt;</a>).
+ant.file the absolute path of the buildfile.
+ant.version the version of Ant
+ant.project.name the name of the project that is currently executing;
+ it is set in the name attribute of &lt;project&gt;.
+ant.project.default-target
+ the name of the currently executing project's
+ default target; it is set via the default
+ attribute of &lt;project&gt;.
+ant.project.invoked-targets
+ a comma separated list of the targets that have
+ been specified on the command line (the IDE,
+ an &lt;ant&gt; task ...) when invoking the current
+ project.
+ This property is set when the first target is executed.
+ So you can't use it in the implicit target (directly
+ under the &lt;project&gt; tag).
+ant.java.version the JVM version Ant detected; currently it can hold
+ the values &quot;1.7&quot;, &quot;1.6&quot;, &quot;1.5&quot;,
+ &quot;1.4&quot;, &quot;1.3&quot; and &quot;1.2&quot;.
+ant.core.lib the absolute path of the <code>ant.jar</code> file.
+</pre>
+
+ <p>There is also another property, but this is set by the launcher
+ script and therefore maybe not set inside IDEs:</p>
+<pre>
+ant.home home directory of Ant
+</pre>
+
+ <p>The following property is only set if Ant is started via the
+ Launcher class (which means it may not be set inside IDEs
+ either):</p>
+<pre>
+ant.library.dir the directory that has been used to load Ant's
+ jars from. In most cases this is ANT_HOME/lib.
+</pre>
+
+ <h1><a name="propertyHelper">PropertyHelpers</a></h1>
+
+ <p>Ant's property handling is accomplished by an instance of
+ <code>org.apache.tools.ant.PropertyHelper</code> associated with
+ the current Project. You can learn more about this class by
+ examining Ant's Java API. In Ant 1.8 the PropertyHelper class was
+ much reworked and now itself employs a number of helper classes
+ (actually instances of
+ the <code>org.apache.tools.ant.PropertyHelper$Delegate</code>
+ marker interface) to take care of discrete tasks such as property
+ setting, retrieval, parsing, etc. This makes Ant's property
+ handling highly extensible; also of interest is the
+ new <a href="Tasks/propertyhelper.html">propertyhelper</a>
+ task used to manipulate the PropertyHelper and its delegates from
+ the context of the Ant buildfile.
+
+ <p>There are three sub-interfaces of <code>Delegate</code> that may be
+ useful to implement.</p>
+
+ <ul>
+ <li><code>org.apache.tools.ant.property.PropertyExpander</code> is
+ responsible for finding the property name inside a string in the
+ first place (the default extracts <code>foo</code>
+ from <code>${foo}</code>).
+
+ <p>This is the interface you'd implement if you wanted to invent
+ your own property syntax - or allow nested property expansions
+ since the default implementation doesn't balance braces
+ (see <a href="https://git-wip-us.apache.org/repos/asf?p=ant-antlibs-props.git;a=blob;f=src/main/org/apache/ant/props/NestedPropertyExpander.java;hb=HEAD"><code>NestedPropertyExpander</code>
+ in the "props" Antlib</a> for an example).</p>
+ </li>
+
+ <li><code>org.apache.tools.ant.PropertyHelper$PropertyEvaluator</code>
+ is used to expand <code>${some-string}</code> into
+ an <code>Object</code>.
+
+ <p>This is the interface you'd implement if you want to provide
+ your own storage independent of Ant's project instance - the
+ interface represents the reading end. An example for this
+ would
+ be <code>org.apache.tools.ant.property.LocalProperties</code>
+ which implements storage
+ for <a href="Tasks/local.html">local properties</a>.</p>
+
+ <p>Another reason to implement this interface is if you wanted
+ to provide your own "property protocol" like
+ expanding <code>toString:foo</code> by looking up the project
+ reference foo and invoking <code>toString()</code> on it
+ (which is already implemented in Ant, see below).</p>
+ </li>
+
+ <li><code>org.apache.tools.ant.PropertyHelper$PropertySetter</code>
+ is responsible for setting properties.
+
+ <p>This is the interface you'd implement if you want to provide
+ your own storage independent of Ant's project instance - the
+ interface represents the reading end. An example for this
+ would
+ be <code>org.apache.tools.ant.property.LocalProperties</code>
+ which implements storage
+ for <a href="Tasks/local.html">local properties</a>.</p>
+ </li>
+
+ </ul>
+
+ <p>The default <code>PropertyExpander</code> looks similar to:</p>
+
+<pre>
+public class DefaultExpander implements PropertyExpander {
+ public String parsePropertyName(String s, ParsePosition pos,
+ ParseNextProperty notUsed) {
+ int index = pos.getIndex();
+ if (s.indexOf("${", index) == index) {
+ int end = s.indexOf('}', index);
+ if (end < 0) {
+ throw new BuildException("Syntax error in property: " + s);
+ }
+ int start = index + 2;
+ pos.setIndex(end + 1);
+ return s.substring(start, end);
+ }
+ return null;
+ }
+}
+</pre>
+
+ <p>The logic that replaces <code>${toString:some-id}</code> with the
+ stringified representation of the object with
+ id <code>some-id</code> inside the current build is contained in a
+ PropertyEvaluator similar to the following code:</p>
+
+<pre>
+public class ToStringEvaluator implements PropertyHelper.PropertyEvaluator {
+ private static final String prefix = "toString:";
+ public Object evaluate(String property, PropertyHelper propertyHelper) {
+ Object o = null;
+ if (property.startsWith(prefix) && propertyHelper.getProject() != null) {
+ o = propertyHelper.getProject().getReference(
+ property.substring(prefix.length()));
+ }
+ return o == null ? null : o.toString();
+ }
+}
+</pre>
+
+
+ <h1>Property Expansion</h1>
+
+ <p>When Ant encounters a construct <code>${some-text}</code> the
+ exact parsing semantics are subject to the configured property
+ helper delegates.</p>
+
+ <h2><code>$$</code> Expansion</h2>
+
+ <p>In its default configuration Ant will expand the
+ text <code>$$</code> to a single <code>$</code> and suppress the
+ normal property expansion mechanism for the text immediately
+ following it, i.e. <code>$${key}</code> expands
+ to <code>${key}</code> and not <code>value</code> even though a
+ property named <code>key</code> was defined and had the
+ value <code>value</code>. This can be used to escape
+ literal <code>$</code> characters and is useful in constructs that
+ only look like property expansions or when you want to provide
+ diagnostic output like in</p>
+
+<pre> &lt;echo&gt;$${builddir}=${builddir}&lt;/echo&gt;</pre>
+
+ <p>which will echo this message:</p>
+
+<pre> ${builddir}=build/classes</pre>
+
+ <p>if the property <code>builddir</code> has the
+ value <code>build/classes</code>.</p>
+
+ <p>In order to maintain backward compatibility with older Ant
+ releases, a single '$' character encountered apart from a
+ property-like construct (including a matched pair of french
+ braces) will be interpreted literally; that is, as '$'. The
+ "correct" way to specify this literal character, however, is by
+ using the escaping mechanism unconditionally, so that "$$" is
+ obtained by specifying "$$$$". Mixing the two approaches yields
+ unpredictable results, as "$$$" results in "$$".</p>
+
+ <h2>Nesting of Braces</h2>
+
+ <p>In its default configuration Ant will not try to balance braces
+ in property expansions, it will only consume the text up to the
+ first closing brace when creating a property name. I.e. when
+ expanding something like <code>${a${b}}</code> it will be
+ translated into two parts:</p>
+
+ <ol>
+ <li>the expansion of property <code>a${b</code> - likely nothing
+ useful.</li>
+ <li>the literal text <code>}</code> resulting from the second
+ closing brace</li>
+ </ol>
+
+ <p>This means you can't use easily expand properties whose names are
+ given by properties, but there
+ are <a href="http://ant.apache.org/faq.html#propertyvalue-as-name-for-property">some
+ workarounds</a> for older versions of Ant. With Ant 1.8.0 and the
+ <a href="http://ant.apache.org/antlib/props/">the props Antlib</a>
+ you can configure Ant to use
+ the <code>NestedPropertyExpander</code> defined there if you need
+ such a feature.</p>
+
+ <h2>Expanding a "Property Name"</h2>
+
+ <p>In its most simple form <code>${key}</code> is supposed to look
+ up a property named <code>key</code> and expand to the value of
+ the property. Additional <code>PropertyEvaluator</code>s may
+ result in a different interpretation of <code>key</code>,
+ though.</p>
+
+ <p>The <a href="http://ant.apache.org/antlibs/props/">props
+ Antlib</a> provides a few interesting evaluators but there are
+ also a few built-in ones.</p>
+
+ <h3><a name="toString">Getting the value of a Reference with
+ ${toString:}</a></h3>
+
+ <p>Any Ant type which has been declared with a reference can also
+ its string value extracted by using the <code>${toString:}</code>
+ operation, with the name of the reference listed after
+ the <code>toString:</code> text. The <code>toString()</code>
+ method of the Java class instance that is referenced is invoked
+ -all built in types strive to produce useful and relevant output
+ in such an instance.</p>
+
+ <p>For example, here is how to get a listing of the files in a fileset,<p>
+
+<pre>
+&lt;fileset id=&quot;sourcefiles&quot; dir=&quot;src&quot; includes=&quot;**/*.java&quot; /&gt;
+&lt;echo&gt; sourcefiles = ${toString:sourcefiles} &lt;/echo&gt;
+</pre>
+
+ <p>There is no guarantee that external types provide meaningful
+ information in such a situation</p>
+
+ <h3><a name="ant.refid">Getting the value of a Reference with
+ ${ant.refid:}</a></h3>
+
+ <p>Any Ant type which has been declared with a reference can also be
+ used as a property by using the <code>${ant.refid:}</code>
+ operation, with the name of the reference listed after
+ the <code>ant.refid:</code> text. The difference between this
+ operation and <a href="#toString"><code>${toString:}</code></a> is
+ that <code>${ant.refid:}</code> will expand to the referenced
+ object itself. In most circumstances the toString method will be
+ invoked anyway, for example if the <code>${ant.refid:}</code> is
+ surrounded by other text.</p>
+
+ <p>This syntax is most useful when using a task with attribute
+ setters that accept objects other than String. For example if the
+ setter accepts a Resource object as in</p>
+<pre>
+public void setAttr(Resource r) { ... }
+</pre>
+
+ <p>then the syntax can be used to pass in resource subclasses
+ previously defined as references like</p>
+<pre>
+ &lt;url url="http://ant.apache.org/" id="anturl"/&gt;
+ &lt;my:task attr="${ant.refid:anturl}"/&gt;
+</pre>
+
+ <h2><a name="if+unless">If/Unless Attributes</a></h2>
+ <p>
+ The <code>&lt;target></code> element and various tasks (such as
+ <code>&lt;fail></code>) and task elements (such as <code>&lt;test></code>
+ in <code>&lt;junit></code>) support <code>if</code> and <code>unless</code>
+ attributes which can be used to control whether the item is run or otherwise
+ takes effect.
+ </p>
+ <p>
+ In Ant 1.7.1 and earlier, these attributes could only be property names.
+ The item was enabled if a property with that name was defined - even to be
+ the empty string or <tt>false</tt> - and disabled if the property was not
+ defined. For example, the following works but there is no way to override
+ the file existence check negatively (only positively):
+ </p>
+ <pre>
+&lt;target name="-check-use-file">
+ &lt;available property="file.exists" file="some-file"/>
+&lt;/target>
+&lt;target name="use-file" depends="-check-use-file" <b>if="file.exists"</b>>
+ &lt;!-- do something requiring that file... -->
+&lt;/target>
+&lt;target name="lots-of-stuff" depends="use-file,other-unconditional-stuff"/>
+ </pre>
+ <p>
+ As of Ant 1.8.0, you may instead use property expansion; a value of
+ <tt>true</tt> (or <tt>on</tt> or <tt>yes</tt>) will enable the
+ item, while <tt>false</tt> (or <tt>off</tt> or <tt>no</tt>) will
+ disable it. Other values are still assumed to be property
+ names and so the item is enabled only if the named property is defined.
+ </p>
+ <p>
+ Compared to the older style, this gives you additional flexibility, because
+ you can override the condition from the command line or parent scripts:
+ </p>
+ <pre>
+&lt;target name="-check-use-file" <b>unless="file.exists"</b>>
+ &lt;available property="file.exists" file="some-file"/>
+&lt;/target>
+&lt;target name="use-file" depends="-check-use-file" <b>if="${file.exists}"</b>>
+ &lt;!-- do something requiring that file... -->
+&lt;/target>
+&lt;target name="lots-of-stuff" depends="use-file,other-unconditional-stuff"/>
+ </pre>
+ <p>
+ Now <code>ant -Dfile.exists=false lots-of-stuff</code> will run
+ <code>other-unconditional-stuff</code> but not <code>use-file</code>,
+ as you might expect, and you can disable the condition from another script
+ too:
+ </p>
+ <pre>
+&lt;antcall target="lots-of-stuff">
+ &lt;param name="file.exists" value="false"/>
+&lt;/antcall>
+ </pre>
+ <p>
+ Similarly, an <code>unless</code> attribute disables the item if it is
+ either the name of property which is defined, or if it evaluates to a
+ <tt>true</tt>-like value. For example, the following allows you to define
+ <tt>skip.printing.message=true</tt> in <tt>my-prefs.properties</tt> with
+ the results you might expect:
+ </p>
+ <pre>
+&lt;property file="my-prefs.properties"/>
+&lt;target name="print-message" <b>unless="${skip.printing.message}"</b>>
+ &lt;echo>hello!&lt;/echo>
+&lt;/target>
+ </pre>
+
+</body>