初识Ant构建 (2.0)

本章目标:规划Ant项目的目录结构以及Ant构建常用命令行选项

1.规划Ant项目结构:

构建文件已经开始编译Java文件了,但是构建的过程十分混乱。源代码,输出文件以及构建文件自身都被堆放在同一个目录中。如果项目稍微变得大一些,局面将会失控。在这件事发生之前,我们需要规划一下构建文件的结构。我们要规划出来的结构在Ant中非常普遍。做这种规划的动力是希望可以对项目进行下面的三种改变。

a)我们希望Ant可以自动清理。如果不能正确地自动清理,那么可能会连带删除Java源代码文件。为了把风险降到最低,你应该把源代码和生成的文件分别放到不同的目录中。

b)我们希望把Java源代码文件放入到Java包中。

c)我们希望创建一个由已编译出的代码构成的JAR文件。它应该放到可以被Ant安全地清理掉的地方。

为了在构建过程中加入对打包和清理的支持,我们必须将源代码,中间文件以及最终文件隔离开。一旦将源代码与生成的文件隔离开,Ant就可以在最后的时间里通过删除输出目录,安全地清理输出内容。由此就简化了清理构建的工作。这样做比把它们混在一起处理更可靠,因为将它们分开后,源代码文件就不可能混入到中间输出的文件中了。养成清理构建的习惯是有好处的。

Ant项目应该把源代码文件,编译类文件和发布包放到不同的目录中。这样更容易在构建过程中管理它们

 目录名

 功能

 src

 源代码文件

 build

 所有在构建过程中生成的文件,它们可以被删除并重新创建

 build/classes

 中间输出文件(可重建;可删除)

 dist

 待发布文件(可重建;可删除)

2.Ant命令行选项

-buildfile              

这个选项可以控制Ant使用哪个构建文件,它允许你将多个项目的目标分到多个文件中,并且根据要做的事情选择适当的构建。-f是-buildfile的快捷方式。

-find    

它后面必须跟着构建文件的名字。这个选项会做一些非常独特的事情:它会在目录树中搜索,在父目录中找到第一个名称相符的构建文件,然后调用它。当你深入到源代码树中编辑文件时,可以利用这个选项。

-emacs

我们希望在调用ant时可以减少输出信息的总量。去掉[java]前缀很容易:只要在运行构建文件时加上-emacs选项就可以了。这个选项会把所有打印行行首的任务名前缀忽略掉。它之所以叫做"emacs",是因为输出的内容是按照emacs风格尽显格式化的,这样其他的编译器可以定位到出现错误的那一行上。

-quiet

只想看到最终构建失败/成功的消息。

-verbose

如果希望深入了解Ant如何工作或者查找构建过程失败的原因。

-debug

该选项不仅包括了所有正常的以及verbose模式的输出,还包括了大量的底层信息。

-keep-going

构建失败:选项会告诉Ant尝试从失败中恢复。如果你再命令行中输入了多余一个的目标,Ant通常会在任何一个目标或者任何它们依赖的目标失败时,停止在失败的那一刻。keep-going选项则会要求Ant继续运行命令行上的其他目标,只要那些目标不依赖于失败的目标。这样,即使主构件过程没有完成,你也可以运行一个用于报告的目标。

-projecthelp

获取项目主要信息:它能列出项目中的主目标(target);当你需要知道一个构建文件提供了那些目标时,-projecthelp可以提供帮助。当我们为一个目标(target)添加了描述信息(description)时,那么该目标就会被标识为"main targets" ,并且会隐藏“other targets”。当有主目标时就不会列出次目标。当没有主目标时,就会列出所有的次目标。为了在项目中看到主目标又看到子目标,你必须同时在项目中使用-projecthelp和-verbose

3.最终实例的目录结构如下

Main.java文件

package org.antbook.welcome;
public class Main{
     public static void main(String args[]){
            System.out.println("---------test-------------");
            for(int i=0; i< args.length; i++){
                 System.out.println(args[i]);

            }

     }
}

最终的构建文件build.xml

<?xml version="1.0"?>
<project name="firstbuild" default="archive">
   <!--强烈建议你为每个有望扮演一个外部调用者的入口点的目标提供描述信息,并且在每个构建文件的顶部加入一两行的说明,描述构建文件的用途是什么-->
   <description>Compiles and runs a simple program</description>
   <!--创建输出目录-->
   <target name="init">
       <mkdir dir="build/classes" />
	   <mkdir dir="dist" />
   </target>
   
   <!--将编译结果保存在输出目录-->
   <target name="compile" depends="init" description="Compiles the source code"><!--description提供描述信息-->
       <javac srcdir="src" destdir="build/classes" />
       <echo>compilation complete!</echo>
    </target>
	
	<!--创建归档文件:archive目标使用<jar>任务创建JAR文件,这个JAR文件包含了build/classes下的所有文件-->
	<target name="archive" depends="compile"  description="Creates the JAR file">
	   <jar destfile="dist/project.jar" basedir="build/classes" />
	</target>
	
	<!--删除输出目录:clean目标通过删除输出目录,完成清理任务。它用到一个新任务<delete>-->
	<target name="clean" depends="init" description="Removes the temporary directories used">
	   <delete dir="build" />
	   <delete dir="dist"  />
	</target>
	
	<target name="execute" depends="compile" description="Run the program">
	   <echo level="warning" message="running"  />
	   <java
	      classname="org.antbook.welcome.Main"<!--执行classes目录中class文件-->
		  classpath="build/classes">
		  <arg value="a" />
		  <arg value="b" />
		  <arg file="." /><!--在执行程序之前,先将这个属性解析成绝对文件地址-->
	   </java>
	</target>
</project>

猜你喜欢

转载自weigang-gao.iteye.com/blog/2166720
今日推荐