惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
K
Kaspersky official blog
L
Lohrmann on Cybersecurity
T
Tenable Blog
Latest news
Latest news
C
CXSECURITY Database RSS Feed - CXSecurity.com
Security Latest
Security Latest
V
Vulnerabilities – Threatpost
The Hacker News
The Hacker News
P
Palo Alto Networks Blog
I
Intezer
T
Threatpost
C
Cisco Blogs
A
Arctic Wolf
C
Cyber Attacks, Cyber Crime and Cyber Security
WordPress大学
WordPress大学
月光博客
月光博客
博客园 - 聂微东
Last Week in AI
Last Week in AI
V
V2EX
小众软件
小众软件
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Simon Willison's Weblog
Simon Willison's Weblog
T
The Exploit Database - CXSecurity.com
宝玉的分享
宝玉的分享
酷 壳 – CoolShell
酷 壳 – CoolShell
Spread Privacy
Spread Privacy
博客园 - 三生石上(FineUI控件)
博客园 - 叶小钗
T
Threat Research - Cisco Blogs
博客园 - Franky
S
Schneier on Security
Know Your Adversary
Know Your Adversary
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
aimingoo的专栏
aimingoo的专栏
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
美团技术团队
T
Tor Project blog
C
Cybersecurity and Infrastructure Security Agency CISA
腾讯CDC
Project Zero
Project Zero
V
Visual Studio Blog
人人都是产品经理
人人都是产品经理
量子位
The GitHub Blog
The GitHub Blog
I
InfoQ
P
Proofpoint News Feed
Cyberwarzone
Cyberwarzone
P
Privacy & Cybersecurity Law Blog
B
Blog RSS Feed

博客园 - BearOcean

LOG.ZS.0001.基于Freetype的游戏字体渲染优化思路 const 和指针 C++ 下啥时候用struct, 啥时候用class C++ 和 Java 中的变参 解决站点关键数据,状态数据,无须持久化数据的一些思路 BS程序代码与安全与基本攻击/防御模式 Struts 实现的I18N 进度,效率,与个人事务管理 Personal Task 1.0 MySql与Java的时间类型 数据挖掘概述 解决Thread 的关闭问题和参数传递时想到的办法. Command 模式 .Net标准控件与自定义控件(2) ToolTipButton 内网聊天工具FreeChat 2.0 FreeChat 2.0 ...大改 模型和架构 局域网聊天工具FreeChat 1.0 开发日志 内网聊天工具FreeChat Beta 为Socket写的附加方法 .Net 事件
Ant 阅读笔记
BearOcean · 2008-05-09 · via 博客园 - BearOcean

Ant 笔记
(0)概述:
Ant, 感觉上类似于原来的make文档。
主要的作用是方便项目的自动部署,现在有一个更新的Meaven可以作为Ant的替代品,不过Ant的应用目前仍然十分广泛。

Ant可以理解为以xml为基础编写的脚本,自动执行以完成一系列的任务。这点和bat也有相似的地方,总之是一个很简单但及其有用的东西。
Ant通常不用作为项目release的组建发布,实际上它一般是在项目开发,部署期间提供的一个发布工具。用ant会简化很多本该手动完成的 文件操作/编译任务。

随便找了一个Ant的Ebook, 资料不多30多页,大致看看,验证我对Ant的猜测是否正确。然后也顺便系统的了解一下Ant的思想和实现。

Ant 需要安装,并且需要设置path环境变量,这样ant 本身发布的命令才能够在命令行环境中执行,这点和JDK的java,javac.等命令是一个意思。

Ant 有个很重要的扩展点是,我们可以很方便地编写自定义的ant任务.

--另外,手上的这本教程是一个UK IBM的工程师写的.
--Ant 的缩写居然是 Another neat tool(另一个灵巧地工具)....

Ant 有一个特性是跨平台,当然这个特性是从Java继承得到的.

(1)Ant脚本(xml)的基本结构:

-project
 |
 |-target1
 |-target2
 |-target3

其中target是步骤地抽象.
target中可以包含任意数量的操作.
这些target中的操作按照一定顺序执行,整个project的任务就实现了.这个project也可以理解为一个ant项目.

(2)Ant的属性:
类似于程序语言中的变量.
名称与键值对的抽象.
具体类似于如下,在脚本的其他位置可以对定义的属性进行引用.
<property name="metal" value="beryllium"/>
引用语法为:
${metal}

Ant中有许多预定义的属性.如Java环境设置.
如:${user.home}
属性经常用于引用文件系统上的文件或者目录.
如果属性是为了定义系统路径,那么使用location 比使用value好.

<property name="srcpath" location="archive/databases/"/>
优于:
<property name="srcpath" value="archive/databases/"/>

因为不同的操作系统,有的用"\"作为路径分隔符,有的用"/"做路径分隔符.
使用location, ant将自动将路径转换成操作系统合法的路径名.从而增加了ant脚本的移植性。
或者干脆同时维护一个win_build.xml和unix_build.xml.

(3)依赖(depends)
<target>可能依赖其它的target.
这句话的意思是指,要完成一个target, 需要优先完成其他的target.
例如:
<target name="init"/>
<target name="preprocess" depends="init"/>
<target name="compile" depends="init,preprocess"/>
<target name="package" depends="compile"/>

如果我们让ant执行任务 package. 那么它会自动先执行init, preprocess, compile, 最后才是package.
这个依赖关系很好理解,但对于ant来说,及其重要,我认为依赖是ant思想的核心。
这样,我也可以只执行compile. 那么操作序列将只进行到compile, 不会执行package.

另外一点需要着重说明: ant中target的执行顺序与target在脚本中出现的位置没有关系。
target的执行由依赖唯一确定。

(4) 运行ant
ant 在eclipse的运行(或其他IDE)不理会了。只关心命令行。IDE也只是用UI来替代了命令行的调用。
ant -file build_prop.xml
运行ant可以编写一个bat来完成。


(5)生成项目
<编译任务>:
由于 Ant 的主要目标是生成 Java 应用程序,它能够内在地、出色地支持调用 javac 编译器以及
其他 Java 相关任务就毫不奇怪了。下面是编译 Java 代码的任务的编写方式:
<javac srcdir="src"/>
这个标签寻找 src 目录中以 .java 为扩展名的所有文件,并对它们调用 javac 编译器,从而在相
同的目录中生成类文件。当然,将类文件放在一个单独的目录结构中通常会更清晰;可以通过添加
destdir 属性来让 Ant 做到这点。其他有用的属性包括:
· classpath:等价于 javac 的 -classpath 选项。
· debug="true":指示编译器应该带调试信息编译源文件。


<JAR任务>
在编译 Java 源文件之后,结果类文件通常被打包到一个 JAR 文件中,这个文件类似 zip 归档文
件。每个 JAR 文件都包含一个清单文件,它可以指定该 JAR 文件的属性。
下面是 Ant 中 jar 任务的一个简单使用例子:
<jar destfile="package.jar" basedir="classes"/>
这将创建一个名为 package.jar 的 JAR 文件,并把 classes 目录中的所有文件添加到其中(JAR
文件能够包含任意类型的文件,而不只是类文件)。此处没有指定清单文件,因此 Ant 将提供一个
基本的清单文件。
manifest 属性允许指定一个用作该 JAR 文件的清单的文件。清单文件的内容还可以使用 manifest
任务在生成文件中指定。这个任务能够像文件系统写入一个清单文件,或者能够实际嵌套在 jar 之
内,以便一次性地创建清单文件和 JAR 文件。 例如:
<jar destfile="package.jar" basedir="classes">
<manifest>
<attribute name="Built-By" value="${user.name}"/>
<attribute name="Main-class" value="package.Main"/>
</manifest>
</jar>


(6)文件系统操作
<创建/删除目录>
最基本的文件系统操作之一就是创建目录或文件夹。做这项工作的任务名为 mkdir,毫不奇怪,它
非常类似于具有相同名称的 Windows 和 UNIX/Linux 命令。
<mkdir dir="archive/metals/zinc"/>

首先要注意 / 被用作目录分隔符,这是 UNIX 和 Linux 的惯例。您可能认为这不是很平台无关的,
但是 Ant 知道如何处理它,并针对它运行所在的平台做恰当的事情,这与我们在前面定义基于位置
的属性时所看到的方式相同。我们能够同样容易地使用 \,而不管平台是什么 —— Ant 能够处理
任一种形式,甚至能够处理两种形式的混合。
mkdir 任务的另一个有用特性是它的如下能力:在父目录还不存在时创建它们。考虑一下上面的清
单,设想 archive 目录存在,但是 metals 目录不存在。如果使用底层平台的 mkdir 命令,您需
要首先显式地创建 metals 目录,然后第二次调用 mkdir 命令来创建 zinc 目录。但是 Ant 任务
Ant 使用指南
Java爱好者 第 20页 http://www.javafan.net
比这更加智能,它能够一次性创建这两个目录。类似地,如果目标目录已经存在,mkdir 任务不会
发出错误消息,而只是假设它的工作已经完成,从而什么也不做。
删除目录同样也很容易:
<delete dir="archive/metals/zinc"/>
这将删除指定的目录连同它包含的所有文件以及子目录。使用 file 属性而不是 dir 属性可以指定
要删除的单个文件。

<复制/移动文件/目录>
在 Ant 中制作文件的一份拷贝很简单。例如:
<copy file="src/Test.java" tofile="src/TestCopy.java"/>
您还可以使用 move 来执行重命名操作而不是拷贝文件:
<move file="src/Test.java" tofile="src/TestCopy.java"/>
另一个常用的文件系统操作是将文件复制或移动到另一个目录。做这项工作的 Ant 语法同样也很简
单:
<copy file="src/Test.java" todir="archive"/>
<move file="src/Test.java" todir="archive"/>

<压缩/解压缩>
<zip destfile="output.zip" basedir="output"/>
Ant 使用指南
Java爱好者 第 21页 http://www.javafan.net
相同的语法也可用于创建 tar 文件。 还可以使用 GZip 和 BZip 任务来压缩文件。例如:
<gzip src="output.tar" zipfile="output.tar.gz"/>
解压缩和提取文件同样也很简单:
<unzip src="output.tar.gz" dest="extractDir"/>
还可以包括 overwrite 属性来控制覆盖行为。默认设置是覆盖与正在被提取的归档文件中的条目相
匹配的所有现有文件。相关的任务名称是 untar、unjar、gunzip 和 bunzip2。


<替换文件中的标记>
我们将在本节考察的最后一个文件系统操作是 replace 任务,它执行文件中的查找和替换操作。
token 属性指定要查找的字符串,value 属性指定一个新的字符串,查找到的标记字符串的所有实
例都被替换为这个新的字符串。例如:
<replace file="input.txt" token="old" value="new"/>


(7)重要的模式匹配 与文件选择器
在前面考察文件系统任务时,我们仅使用了单独地命名的文件和目录。然而,一次对一组文件执行
那些操作经常是有用的 —— 例如对给定目录中以 .java 结尾的所有文件执行操作。正如等价的
DOS 和 UNIX 命令提供了这样的功能一样,Ant 也提供了这样的功能。这是使用通配符字符来完成
的:*,它匹配零个或多个字符;以及 ?,它仅匹配一个字符。因而匹配以 .java 结尾的所有文件
的模式不过就是 *.java。
也可以对目录执行模式匹配。例如,模式 src*/*.java 将匹配带 src 前缀的任何目录中的所有
Java 文件。 还有另一种模式结构:**,它匹配任意数量的目录。例如,模式 **/*.java 将匹配当
前目录结构下的所有 Java 文件。
您能够以相当一致的方式对文件系统任务使用模式,比如嵌套的 fileset 元素。先前,我们使用这
个任务来复制单个文件:
<copy file="src/Test.java" todir="archive"/>
如果我们想要使用一个模式,可以将 file 属性替换为一个 fileset 元素,如下所示:
<copy todir="archive">
<fileset dir="src">
<include name="*.java"/>
</fileset>
</copy>
fileset 默认情况下包含指定 src 目录下的所有文件,因此为了仅选择 Java 文件,我们对模式使
用一个 include 元素。类似地,我们可以对另一个模式添加一个 exclude 元素,从而潜在地排除
include 指定的匹配项。甚至可以指定多个include 和 exclude 元素;这样将得到一组文件和目录,
它们包含 include 模式的所有匹配项的并集,但排除了 exclude 模式的所有匹配项。
注意还有一个通常很有用的文件集特性,但是对于没有意识到它的人来说,这个特性偶尔会产生混
淆。这个特性称为 默认排除:即自动从文件集内容中排除的内置模式列表。该列表包括与名为 CVS
的目录相匹配的条目,以及以 ~ 字符结尾的文件,它们可能是备份文件。您通常不想在文件系统操
作中包括这类文件和目录,因此排除这些文件是默认行为。然而,如果确实想无例外地选择 所有 文
件和目录,可以将文件集的 defaultexcludes 属性设置为 no。


正如我们已经看到的,文件集用于指定一组文件,并且这个组的内容可以使用 include 和 exclude
模式来指定。也可以结合称为 选择器 的特殊元素使用include 和 exclude 来选择文件。下面是
对 Ant 可用的核心选择器的列表:
· size:这个选择器用于根据文件的字节大小选择文件(除非使用 units 属性来指定了不同
的单位)。when 属性用于设置比较的性质(less、more 或者 equal),value 属性定义每
个文件将与之作比较的目标大小。
· contains:只有包含给定文本字符串(由text 属性指定)的文件才匹配这个选择器。默认
情况下,查找操作是大小写敏感的;添加casesensitive="no" 可以改变默认设置。
· filename:name 属性指定文件名要与之匹配的模式。它本质上与 include 元素相同,以及
与指定了negate="yes" 时的 exclude 元素相同。
· present:从当前目录结构中选择如下文件:它们与指定的 targetdir 目录中的文件具有相
同的名称和相对目录结构。
· depend:这个选择器与 present 选择器具有相同的效果,只不过匹配的文件被限制到相对
于 targetdir 位置中的对应文件来说,最近已修改过的那些文件。
· date:这个选择器基于其最后修改日期选择文件。when 属性指定作比较的性质是 before、
after 还是 equal,datetime 属性指定与之作比较的日期和时间,这个日期和时间具有给
定的固定格式 MM/DD/YYYY HH:MM AM_or_PM。注意 Windows 平台上有一个内置的 2 秒偏移,
以允许底层文件系统的不精确性 —— 这可能导致匹配的文件数量超过预期。允许的回旋时
间量可以使用 granularity 属性来更改(以毫秒为单位来指定)。
· depth:这个选择器检查每个文件的目录结构层次数目。min 和/或 max 属性用于选择具有
想要的目录层次数目的的文件。
Ant 使用指南
Java爱好者 第 24页 http://www.javafan.net
还可以通过在一个选择器 容器 内嵌套一个或多个选择器来组合选择器。 最常用的选择器容器 and
仅选择它包含的所有选择器都选择了的文件。其他选择其容器包括 or、not、none 和 majority。
下面是一个文件集的例子,它仅选择那些大于 512 字节并且包含字符串“hello”的文件。
<fileset dir="dir">
<and>
<contains text="hello"/>
<size value="512" when="more"/>
</and>
</fileset>


(
后面还有文件链接和 自定义Ant任务没有察看。
具体的运用可以具体分析,如此。利用于ant的能力,可以设想一个项目的release过程:
(1)调用cvs任务,以某个只读权限从服务器下载项目。
(2)调用javac任务对项目进行编译。
(3)调用文件系统任务(包含模式匹配和文件选择器)对已生成的.class文件和资源文件进行部署。
(4)调用文件系统任务对配置文件进行部署。
....
整个一条龙服务。。。
)