Ant : another neat tool ;
Ant 本身是用Java语言来写的,所以Ant使用Java类来定义生成文件之间的依赖关系;
Ant 生成文件剖析:
Ant没有定义它自己的自定义语法;相反,它的生成文件是用XML编写的;
存在一组Ant能够理解的预定义XML元素,还可以定义新的元素来扩展Ant的功能;
每个生成文件仅有一个project元素,该元素作为根元素包含一个或多个target元素,一个target就是一个目标,是生成过程中已定义的一个步骤,它执行任意数量的操作,这些操作本身是由其他专用任务标签执行的,然后这些任务将根据需要被分组到各个target元素中;一次生成过程所必须的所有操作可以放入单个target元素中,但是那样会降低灵活性;所以一般将每个步骤含在它自己的target元素中。这样的话可以执行整体生成过程中的单独部分,不一定要执行其他部分。
1, Project 元素的属性deault :如果在Ant被调用的时候没有指定目标,这个属性将指定要执行的目标。然后需要target元素来定义该目标本身。
例子:
<?xml varsion=”1.0”?>
<project default=”init”>
<target name=”init”>
</target>
</project>
当元素没有包含任何的内容时,我们可以写为<target name=”init”/>
2,添加描述:用Ant自己的description元素或者XML注释;
<?xml version=”1.0”?>
<project default=”init” name=”Project Argon”>
<description>A simple project introducing the user of ….
</description>
<!—XML comments can also be user-- >
<target name=”init” description=”Initialize Argon database”>
<! - - perform initialization steps here - - >
</target>
</project>
3,属性:Ant 中的属性类似编程语言中的变量,有名称和值;但是属性是不可改变的;
定义一个属性:
<property name=”metal” value=”beryllium”/>
引用这个属性:
${metal} 例:<property name=”metal-database” value=”${metal}.db”/>
Ant中预定义的属性:
1,Java环境设置用于运行Ant的所有系统属性,可作为Ant属性使用:{user.home}
${ant.version} ;
${basedir} 这个属性是项目目录的绝对路径;
2,平台无关的文件系统路径,在属性中用location来代替value:
<property name=”database-file” location=”archive/databases/${metal}.db”/>
和 <property name=”database-file” location=”archive/databases/${metal}.db”/>
都会在不同的平台上有相同的行为;
******注意,文件名是相对的,它被认为是相对于项目的基目录;
3,定义依赖关系:生成一个项目的多个步骤需要有特定的顺序;Ant不使用顺序指定 target的方法,而是采用依赖来实现:target元素的一个属性depends;
<target name=”init”/>
<target name=”preprocess” depends=”init”/>
<target name=”complie” depends=”init,prepeocess”/>
<target name=”package” depends=”compile”/>
注意:目标出现在文件中的顺序并不重要,执行顺序是由depends属性唯一确定的;
运行Ant
1,命令行使用:Ant默认寻找一个build.xml的文件;所以如果你的生成文件就是用build.命名的,就不需要在命令行中指定它;
事实是使用其他名称的生成文件更方便,所以用: -buildfile<file> 或者-file<file>,,,-f<file>
-d 选项是另一个有用的参数,它用于设置随后可以在生成文件中使用的属性的值;这可以帮助你选择你的生成过程以某种方式开始;因为生成文件中定义的属性一经赋值就不能不改变了,所以如果你在命令中使用了-d metal=beryllium的话,-d 标志在读取生成文件中的信息之前设置了属性metal的值,那么生成文件中的初始属性设置就无效了;这可谓是动态的;
2,IDE集成:省略,日后学会了再添加;
生成Java简单项目
1,编译Java代码的任务的编写方式:
<javac srcdir=”src”/> 这个标签寻找src目录中以.java为扩展名的所有文件,并对它们调用javac编译器,从而在相同的目录中生成类文件;如果添加destdir属性就可以把类文件放在一个单独的目录中;
Javac的其他属性 classpath 等价于-classpath ; debug=”true”:指示编译器应该大调试信息编译源文件。
Javac标签不会编译:它的类文件已经存在,并且对应的源文件自从该类文件生成以来还没有改变过的源文件;如果不想这样,clean是一个很好的选择:移除生成的任何类文件;
Ant的特点是:如果某个任务能够确定所请求的操作不需要执行,那么该操作就会被跳过;
Ant,Javac编译器本身都是用Java语言实现的,所以运行Ant和执行Javac任务使用同一个JVM实例;这是高效的表现;
Ant的Javac任务的默认行为是调用运行Ant本身的任何JVM的标准编译器,然而如果你想要单独地调用编译器,比如你要使用一个高级别的编译器,你可以使用javac的fork属性:<javac srcdir=”src” fork=”true”/>
例如:想要指定一个不同的javac可执行文件,并向它传递一个最大内存设置:
<javac srcdir=”src” fork=”ture” executable=”d:/sdk141/bin/javac” memoryMaximumSize=”128m”/>
2,创建jar文件的编写:
<jar destfile=”package.jar” basedir=”classes”/>
将创建一个package.jar文件,并把classes目录中的所有文件而不只是类文件添加到其中;
Manifest属性:<jar destfile=”package.jar” basedir=”classes”>
<manifest>
<attribute name=”Built-By” value=”${user.name}”/>
<attribute name=”Main-class” value=”package.Main”/>
</mainifest>
</jar>
注意,manifest本身是<jar>任务的一个属性,可以指定用做该jar文件的清单的文件;
但是这里manifest是个任务,被嵌套在了<jar>任务中;这个manifest任务能够象文件系统写入一个清单文件;
4,时间戳生成:
<tstamp>
例如:<jar destfile=”package-${DSTAMP}.jar” basedir=”classes”/>
如果这个任务是2005年11月13日调用,则生成的jar文件被命名为package-20051113.jar;
举例用了一下,确实TMD好用;
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=533308