属性

描述

在项目中设置一个属性(通过名称和值),或一组属性(来自文件或资源)。属性区分大小写。

属性是不可变的:第一个设置属性的人会将其冻结以供构建的其余部分使用;它们绝对不是变量。

有七种方法可以设置属性

虽然可以组合使用这些方法,但一次只应使用一种方法。例如,可能会出现有关设置属性的顺序的问题。

正在设置的属性的值部分可能包含对其他属性的引用。这些引用在设置这些属性时解析。这也适用于从属性文件加载的属性。

可以在此处找到预定义属性的列表。

自 Apache Ant 1.8.0 起,可以在 Java 5+ 上运行时,根据Sun DTD加载在 XML 中定义的属性。为此,文件、资源或 URL 的名称必须以.xml结尾。

参数

属性 描述 必需
name 要设置的属性的名称。
value 属性的值。 当设置了name属性时,这些属性之一或嵌套文本
location 将属性设置为给定文件的绝对文件名。如果此属性的值是绝对路径,则保持不变(将/\字符转换为当前平台的约定)。否则,它将被视为相对于项目的basedir的路径并进行扩展。
refid 对在其他地方定义的对象的引用。仅对对类似路径的结构或属性的引用产生合理的结果。
resource 包含属性文件格式的属性设置的类路径资源的名称。 这些属性之一,**除非**设置了name属性
file 要加载的属性文件的位置。
url 包含属性格式设置的 URL。
environment 检索环境变量时要使用的前缀。因此,如果您指定environment=myenv,您将能够通过属性名称myenv.PATHmyenv.TERM访问特定于操作系统的环境变量。请注意,如果您提供一个以.结尾的属性name,它不会加倍;即environment=myenv.仍然允许通过myenv.PATHmyenv.TERM访问环境变量。此功能目前仅在某些平台上实现。请随时发送补丁以增加支持此功能的平台数量 ;-)。
另请注意,属性区分大小写,即使您操作系统上的环境变量不区分大小写;例如,Windows 2000 或更高版本系统路径变量设置为名为env.Path而不是env.PATH的 Ant 属性。
runtime 检索运行时属性时要使用的前缀。因此,如果您指定runtime=myrt,您将能够通过属性名称myrt.availableProcessorsmyrt.maxMemorymyrt.totalMemorymyrt.freeMemory访问与Runtime类中的方法相对应的运行时值。请注意,如果您提供一个以.结尾的属性名称,它不会加倍;即runtime=myrt.仍然允许访问运行时属性,例如myrt.maxMemory
另请注意,属性值是在执行property时获取的快照。自 Ant 1.10.4 起
classpath 查找资源时要使用的类路径。
classpathref 查找资源时要使用的类路径,以对在其他地方定义的<path>引用形式给出。
prefix 应用于使用fileresourceurl加载的属性的前缀。如果未指定,则会在前缀后附加一个.
prefixValues 是否在扩展使用fileresourceurl加载的属性的右侧时应用前缀。自 Ant 1.8.2 起 否;默认值为false
relative 如果设置为true,则设置相对于basedir的相对路径。自 Ant 1.8.0 起 否;默认值为false
basedir 用于计算相对路径的basedir自 Ant 1.8.0 起 否;默认值为项目的basedir

OpenVMS 用户

使用environment属性,此任务将加载 OpenVMS 系统上定义的所有逻辑。具有多个等效名称的逻辑将映射到一个属性,该属性的值是所有等效名称的逗号分隔列表。如果逻辑在多个表中定义,则仅提供最本地定义(表优先级顺序为 PROCESS、JOB、GROUP、SYSTEM)。

除 OpenVMS 之外的任何操作系统

自 Ant 1.8.2 起,如果 Ant 检测到它在 Java 5 或更高版本上运行,Ant 将使用System.getenv()而不是它自己的操作系统相关本机实现。对于某些操作系统,这会导致与 Ant 的旧版本相比存在细微差异。有关完整列表,请参阅Bugzilla 问题 49366。特别是

作为嵌套元素指定的参数

classpath

Propertyclasspath属性是类似路径的结构,也可以通过嵌套的classpath元素设置。

示例

将属性foo.dist设置为值dist

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

将属性foo.dist设置为值dist

<property name="foo.dist">dist</property>

从名为foo.properties的文件中读取一组属性。

<property file="foo.properties"/>

从地址https://www.mysite.com/bla/props/foo.properties读取一组属性。

<property url="https://www.mysite.com/bla/props/foo.properties"/>

从名为foo.properties的资源中读取一组属性。

<property resource="foo.properties"/>

请注意,您可以使用以下方法为所有 Ant 构建引用全局属性文件

<property file="${user.home}/.ant-global.properties"/>

因为user.home属性由 JVM 定义为您的主目录。user.home属性在文件系统中解析的位置取决于操作系统版本和 JVM 实现。在基于 Unix 的系统上,这将映射到用户的 home 目录。在现代 Windows 变体上,这很可能解析到用户在Documents and SettingsUsers文件夹中的目录。较旧的 Windows 变体(如 Windows 98/ME)不太可预测,其他操作系统/JVM 组合也是如此。

读取系统环境变量并将它们存储在属性中,以env为前缀。请注意,这仅在某些操作系统上有效。显示了两个值的回显。

<property environment="env"/>
<echo message="Number of Processors = ${env.NUMBER_OF_PROCESSORS}"/>
<echo message="ANT_HOME is set to = ${env.ANT_HOME}"/>

此构建文件使用build.properties中定义的属性。关于环境变量STAGE,某些或所有值都可能被覆盖,例如,如果STAGE=test并且有一个test.properties,则您将拥有该变量的特殊值(例如,测试服务器的另一个名称)。最后,所有这些值都可能被每个用户的个人设置文件覆盖。

<property environment="env"/>
<property file="${user.name}.properties"/>
<property file="${env.STAGE}.properties"/>
<property file="build.properties"/>

将相对路径存储在foo中:../my/file.txt

<property name="foo" location="my/file.txt" relative="true" basedir=".."/>

将相对路径存储在foo中:cvs/my/file.txt

<property name="foo" location="my/file.txt" relative="true" basedir="cvs"/>

属性文件

如前所述,此任务将加载存储在文件系统中的属性文件,或作为类路径上的资源。以下是一些关于此功能的有趣事实

  1. 如果文件不存在,则除了在-verbose日志级别之外,不会打印任何内容。这使您可以为每个项目拥有可选的配置文件,团队成员可以对其进行自定义。
  2. 此格式的规则与java.util.Properties匹配。
  3. 不会去除尾随空格。这可能是您想要的。
  4. 想要非标准字符?使用\u0456\"样式转义它们。
  5. Ant 属性在文件中扩展
  6. 如果您想扩展在同一文件中定义的属性,并且使用任务的prefix属性,则在扩展属性时必须使用相同的前缀,或者将prefixValues设置为true

文件内属性扩展非常酷。学习使用它。

示例

build.compiler=jikes
deploy.server=lucky
deploy.port=8443
deploy.url=https://${deploy.server}:${deploy.port}/

关于环境变量的说明

当 Ant 开始支持从环境变量设置属性时,它在 Java 1.2 上运行,其中System.getEnv不起作用。因此,我们决定在一个新进程中启动一个命令,该命令打印环境变量,分析输出并创建属性。在 Ant 1.9.0 中,当我们开始要求 Java 5 时,我们切换回System.getEnv,即使它在某些平台上返回了不同的结果。下面描述的命令仍然在 OpenVMS 上使用,或者如果System.getEnv抛出异常。

Execute.java(方法getProcEnvCommand())中实现了以下操作系统的命令

操作系统 命令
os/2 cmd /c set
windows
* win9x command.com /c set
* 其他 cmd /c set
z/os /bin/env **或** /usr/bin/env **或** env取决于读取权限
unix /bin/env **或** /usr/bin/env **或** env取决于读取权限
netware env
os/400 env
openvms show logical