[Ant][StartWithAnt] 第三章 特性property

本文详细介绍了Ant中设置属性(property)的6种方式,包括直接赋值、从文件导入、读取环境变量、网络文件、命令行结果,以及属性的不可变性和作用域。提供了相关代码示例,帮助理解Ant属性的使用方法。

点击此处下载StartWithAnt完整的pdf文档与代码:http://download.csdn.net/detail/sodino/6603769


自定义构建过程中,特性 property 提供获取高频度使用的字符串的简便方式。一个特性拥有一个区分大小写的name和一个 value,要直接使用某一特性的具体赋值时,需要引用这样的格式:”${name}”。假设有一特性名为”builddir”并被赋值为”build”,则可以这样引用到到一个新值中去,如”${builddir}/classes”,在运行时环境中该值将被解析为”build/classes”。

1.设置特性的方式

设置一个特性并对其赋值有6种方式,下面一一道来。

1.1 直接赋值

<property name="name1.1" value="set by value"/>
<property name="name1.2">Nested a text</property>

代码3.1 

直接赋值的方式可以是同时对”name”和”value”进行设置具体值,如${name1.1};也可以只将”value”值嵌套在<property>标签内,如${name1.2}

1.2 由文件路径相关设置特性

与单个文件路径相关的特性可以通过设置location指定相关文件名,并额外可以选用相对路径模式,设置relativetrue,并将相对的基础目录basedir赋值。见代码3.2 ${name2.1}

亦可以设置文件过滤器,将一系列符合过滤条件的目标文件以绝对路径的形式按顺序组合起来,作为特性的结果值。设置文件过滤器fileset及文件路径path将会在以后的章节中讲到。本例子中只是需要准备一个path元素并作为参数对属性中的refid赋值即可。见代码3.2 ${name2.2}

<!-- 第二种方式:路径相关  与指定文件相关 -->

<property name="name2.1" location="README.md" relative="true" basedir="..\"/>

<!-- 第二种方式:路径相关  与指定文件类型相关 

列出当前目录下所有.xml文件的绝对路径 -->

<path id="all.xml.path">
<fileset dir=".">
<include name="**/*.xml"/>
</fileset>
</path>
<property name="name2.2" refid="all.xml.path"/>

代码3.2 

下图给出了代码3.2 的具体运算结果。


3.2 运行结果。

1.3 从文件中直接导入

有时为了方便亦可以从文件中直接导入特性。但对文件的内容有具体的格式要求。文件内容必须是以<key,value>的形式排版,并且不能包含汉字。对于出现的汉字需要以转义符的形式出现。

name3.1_web=qq.com
name3.1_im=qq.pc

代码3.3 直接导入的文件内容格式

导入文件的方式也非常简单,在特性中对其元素file赋值即可。

<property file="res_03.1property.01.properties"/>
<!-- 使用导入的特性 -->
<echo message="${name3.1_web}"></echo>
<echo message="${name3.1_im}"></echo>

代码3.4 直接导入的文件内容格式

有时文件不存在于可直接访问的路径下,如文件被存于某个.jar 包中。则需要在特性中通过classpath指明.jar路径(相对于已经声明的basedir),并以资源读取的方式将peoperty文件在jar内的完整包路径完整写出。

<property classpath="properties.jar" 
         resource="lab/sodino/res_03.1property.02.properties"/>
<!-- 使用导入的特性 -->
<echo message="${name3.2_machine}"></echo>
<echo message="${name3.2_mobile}"></echo>

代码3.5 jar中导入特性配置文件

1.4 从已经设置的环境变量中读取

先来查看一下当前已设置的环境变量,右击“我的电脑”→“高级系统设置”,在弹出的“系统属性”框中选择“高级”标签卡点击“环境变量”。如下图3.3


3.3 系统环境变量

环境变量中声明了一些系统属性,如当前系统名、关键的项目路径等。假设需要获取”OS”的值,需要将所需特性property与当前系统环境关联起来,设置”environment=env”,用”env”表示当前系统环境;并作为当前系统环境下所有系统属性的参数前缀。如用”${env.OS}”来表示当前系统环境中“OS”的真实值。做法如下:

<property environment="env"/>
<echo message="${env.OS}"></echo>

代码 3.6 关联系统环境

1.5 从网络文件中读取

特性支持直接从网络文件中导入。网络文件的格式要求与从本地文件中导入读取的要求相同,文件内容亦都是以<K,V>形式存在,对字符集亦有同样要求。设置特性中”url”指定网络文件链接即可。

如果该特性是直接声明在project下,则会在运行target之前,去访问该链接,此时会有卡顿。如果是声明在target内,则只有Ant运行到该target且运行到该句特性声明时,才会去读取网络文件链接。

直接给出示例如下:

<property url="http://www.sodino.com/res_03.1property.url.properties"/>

代码 3.7 从网络文件中读取

1.6 由命令行运行结果设置

当需要使用到命令行的运行结果作为Ant任务的参数时,也有方便的处理方法:

<exec executable="hostname" outputproperty="name5.host.name"
 errorproperty=”name5.error”/>
<echo message="${name5.host.name}"></echo>

代码3.8 获取主机名

通过exec任务执行本地命令”hostname”来获取设置的主机名,并将该命令正常运行的输出结果,即本设置的主机名,将会赋值到特性”name5.host.name”中去,如果找不到该本地命令或者命令执行过程中出错,则会将出错内容提法赋值到”name5.error”中去。

对特性property的声明与赋值到这里就讲完了。相关示例代码见ant_demo\build_03.1_property_.xml

2.特性的不可变性

特性(property)在声明被赋值之后,其值是不可变的,在整个编译文件中将视为常量而非变量。

在下面的代码中,特性”color”先被赋值为”blue”,然后再被赋值为”red”,Ant在构建过程中将对其第二次赋值视为无效。在接下来的打印输出中仍打印出”blue”。

<property name="color" value="blue"/>
<property name="color" value="red"/>
<!--特性的不可变性,此处将打印出"color"的第一次赋值"blue"-->
<echo message="${color}"></echo>

代码3.9 特性的不可变性

3.特性的作用域

工程级元素(project level,<project>元素内的XML)的第一级特性(property)具有作用域是全局的,在构建文件中一直都有效。在目标(target)标签下声明的特性在当前目标target内有效,并且其作用域延续到之后运行的其它目标(target)内。

在如下的代码3.10 中,声明了一个具有全局作用域的特性 “color”,能够直接被构建文件中的所有目标(target)直接使用。在目标(target)”Scope”下,单独声明了一个内部特性”inner.color”。该特性在另一个目标(target)”ScopeNew”中被引用到。如果仅运行目标”ScopeNew”,则仅会打印出字符“${inner.color}”;但若先运行目标”Scope”再接着”ScopeNew”,则"ScopeNew"打印出来的会是特性${inner.color}的实际值”red”。

<project name="ScopeProject" default="ScopeSecond" basedir=".">
<property name="color" value="blue"/>
    <target name="ScopeFirst">
    	<property name="inner.color" value="red"/>
<!--特性的不可变性,此处将打印出"color"的第一次赋值"blue"-->
<echo message="${color}"></echo>
    </target>
    <target name="ScopeNew">
    	<echo message="${inner.color}"></echo>
    </target>
</project>

代码3.10 作用域

3.4 作用域

在图3.4的运行效果中,当只运行目标(target) “ScopeSecond”时,对于特性“inner.color”由于未被赋值,只被当作字符串打印出来。接下来的第二条命令先运行了目标targetScopeFirst”,有对特性”inner.color”赋值为”red”了,则当运行到目标targetScopeSecond”时,则打印出了值”red”。

此处解释一下ant命令行参数。由于一个ant构建文件由多个目标target组成,当想指定运行某个或某几个目标target时,可以在ant命令后添加目标target的名称。如下:

ant -f buildfile.xml TargetA TargetB ... ... TargetN


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值