linux-ant

来源:互联网 发布:日剧 知乎 编辑:程序博客网 时间:2024/05/17 15:05

ant初识

http://hi.baidu.com/yinjicheng1987/item/f0909a15dcd1f7fdddeecabe

1,我的ant HelloWorld

http://zhyt710.blog.sohu.com/3611477.html
Ant是用来编译和打包项目的工具,这里给出一个测试用例:

1.1,文件结构

.├── build.xml└── src    └── HelloWorld.java

1.2,HelloWorld.java

事实上这个package是什么并没有关系,你也不必在当前文件夹下建立这样的子目录/myant./demo/。这个package会在编译以后在我们定义的classes文件夹下自动编译出目录来。

package myant.demo;public class HelloWorld{      public static void main( String args[] )      {           System.out.println("Hello world. ");      }}

1.3,build.xml

<?xml version="1.0" encoding="gbk" ?><!--工程的名字是HelloWorld--><project name="HelloWorld" default="run" basedir=".">   <!-- 定义资源,包括源文件目录,目标文件目录,和jar文件 -->   <property name="src" value="src"/>   <property name="dest" value="classes"/>   <property name="hello_jar" value="hello.jar"/>   <!-- 定义第一个目标:初始化,新建目标文件目录 -->   <target name="init">   <mkdir dir="${dest}"/>   </target>   <!-- 定义第二个目标:编译源文件,把产品放入classes/-->   <target name="compile" depends="init">   <javac srcdir="${src}" destdir="${dest}"/>   </target>   <!-- 定义第三个目标:构建jar文件,目标文件为hello_jar指定的文件名 -->   <target name="build" depends="compile">   <jar jarfile="${hello_jar}" basedir="${dest}"/>   </target>   <!-- 定义最后一个目标:运行文件 -->   <target name="run" depends="build">   <java classname="myant.demo.HelloWorld" classpath="${hello_jar}"/>   </target></project>

mkdir是建立目录,
delete是删除目录,
javac是编译命令,
java是运行命令,
classname是要运行的类,
classpath是要运行的类jar文件的路径
srcdir是源文件所在目录,
destdir是编译后目标文件所在目录
jar是打包命令,
basedir是要打包文件所在目录,
jarfile是编译后生成的jar文件
depends属性是target之间相互依赖的关系
default属性是ant默认执行的参数.
ant 和 ant run执行的结果是一样的.

1.4,运行ant

[xxx@xxxsrc]$ antBuildfile: /home/xxx/test/src/build.xmlinit:    [mkdir] Created dir: /home/xxx/test/src/classescompile:    [javac] /home/xxx/test/src/build.xml:17: warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds    [javac] Compiling 1 source file to /home/xxx/test/src/classesbuild:      [jar] Building jar: /home/xxx/test/src/hello.jarrun:     [java] Hello world.BUILD SUCCESSFULTotal time: 0 seconds

1.5,生成的文件夹结构

.├── build.xml├── classes│   └── myant│       └── demo│           └── HelloWorld.class├── hello.jar└── src    └── HelloWorld.java

http://www.cnblogs.com/clarkchen/archive/2011/03/10/1980194.html

2,ant简介

2.1,Ant的概念 

可能有些读者并不连接什么是Ant以及入可使用它,但只要使用通过Linux系统得读者,应该知道make这个命令。当编译Linux内核及一些软件的源程序时,经常要用这个命令。Make命令其实就是一个项目管理工具,而Ant所实现功能与此类似。像make,gnumake和nmake这些编译工具都有一定的缺陷,但是Ant却克服了这些工具的缺陷。最初Ant开发者在开发跨平台的应用时,用样也是基于这些缺陷对Ant做了更好的设计。 

2.2,Ant的优点 

Ant是Apache软件基金会JAKARTA目录中的一个子项目,它有以下的优点。跨平台性。Ant是存Java语言编写的,所示具有很好的跨平台性。操作简单。Ant是由一个内置任务和可选任务组成的。Ant运行时需要一个XML文件(构建文件)。Ant通过调用target树,就可以执行各种task。每个task实现了特定接口对象。由于Ant构建文件时XML格式的文件,所以和容易维护和书写,而且结构很清晰。Ant可以集成到开发环境中。由于Ant的跨平台性和操作简单的特点,它很容易集成到一些开发环境中去。 

2.3,Ant 开发

Ant的构建文件当开始一个新的项目时,首先应该编写Ant构建文件。构建文件定义了构建过程,并被团队开发中每个人使用。Ant构建文件默认命名为build.xml,也可以取其他的名字。只不过在运行的时候把这个命名当作参数传给Ant。构建文件可以放在任何的位置。一般做法是放在项目顶层目录中,这样可以保持项目的简洁和清晰。下面是一个典型的项目层次结构。 
(1) src存放文件。 
(2) class存放编译后的文件。 
(3) lib存放第三方JAR包。 
(4) dist存放打包,发布以后的代码。 
Ant构建文件是XML文件。每个构建文件定义一个唯一的项目(Project元素)。每个项目下可以定义很多目标(target元素),这些目标之间可以有依赖关系。当执行这类目标时,需要执行他们所依赖的目标。每个目标中可以定义多个任务,目标中还定义了所要执行的任务序列。Ant在构建目标时必须调用所定义的任务。任务定义了Ant实际执行的命令。Ant中的任务可以为3类。 
(1) 核心任务。核心任务是Ant自带的任务。 
(2) 可选任务。可选任务实来自第三方的任务,因此需要一个附加的JAR文件。 
(3) 用户自定义的任务。用户自定义的任务实用户自己开发的任务。 

举例如下:

通常,src存放Java源文件,classes存放编译后的class文件,lib存放编译和运行用到的所有jar文件,web存放JSP等web文件,dist存放打包后的jar文件,doc存放API文档。 

<? xml   version = "1.0" ?>   < project   name = "Hello world"   default = "doc" >   <!-- properies -->        < property   name = "src.dir"   value = "src"   />        < property   name = "report.dir"   value = "report"   />        < property   name = "classes.dir"   value = "classes"   />        < property   name = "lib.dir"   value = "lib"   />        < property   name = "dist.dir"   value = "dist"   />   < property   name = "doc.dir"   value = "doc" />        <!-- 定义classpath -->        < path   id = "master-classpath" >            < fileset   file = "${lib.dir}/*.jar"   />            < pathelement   path = "${classes.dir}" />        </ path >        <!-- 初始化任务 -->        < target   name = "init" >        </ target >        <!-- 编译 -->        < target   name = "compile"   depends = "init"   description = "compile the source files" >            < mkdir   dir = "${classes.dir}" />            < javac   srcdir = "${src.dir}"   destdir = "${classes.dir}"   target = "1.4" >                < classpath   refid = "master-classpath" />            </ javac >        </ target >        <!-- 测试 -->        < target   name = "test"   depends = "compile"   description = "run junit test" >            < mkdir   dir = "${report.dir}" />            < junit   printsummary = "on"                    haltonfailure = "false"                    failureproperty = "tests.failed"                    showoutput = "true" >                < classpath   refid = "master-classpath"   />                < formatter   type = "plain" />                < batchtest   todir = "${report.dir}" >                    < fileset   dir = "${classes.dir}" >                        < include   name = "**/*Test.*" />                    </ fileset >                </ batchtest >            </ junit >            < fail   if = "tests.failed" >            ***********************************************************           ****   One or more tests failed!   Check the output ...   ****           ***********************************************************           </ fail >        </ target >        <!-- 打包成jar -->        < target   name = "pack"   depends = "test"   description = "make .jar file" >         < mkdir   dir = "${dist.dir}"   />            < jar   destfile = "${dist.dir}/hello.jar"   basedir = "${classes.dir}" >                < exclude   name = "**/*Test.*"   />                < exclude   name = "**/Test*.*"   />            </ jar >        </ target >        <!-- 输出api文档 -->        < target   name = "doc"   depends = "pack"   description = "create api doc" >         < mkdir   dir = "${doc.dir}"   />         < javadoc   destdir = "${doc.dir}"                author = "true"                version = "true"                use = "true"                windowtitle = "Test API" >                < packageset   dir = "${src.dir}"   defaultexcludes = "yes" >                    < include   name = "example/**"   />                </ packageset >                < doctitle > <![CDATA[<h1>Hello, test</h1>]]> </ doctitle >                < bottom > <![CDATA[<i>All Rights Reserved.</i>]]> </ bottom >                < tag   name = "todo"   scope = "all"   description = "To do:"   />            </ javadoc >        </ target >   </ project >   

以上xml依次定义了init(初始化),compile(编译),test(测试),doc(生成文档),pack(打包)任务,可以作为模板。 


http://blog.chinaunix.net/uid-9398085-id-362360.html

3,详细解释一个示例

3.1,什么是ant

ant是构建工具

3.2,什么是构建

概念到处可查到,形象来说,你要把代码从某个地方拿来,编译,再拷贝到某个地方去等等操作,当然不仅与此,但是主要用来干这个

3.3,ant的好处

跨平台    --因为ant是使用java实现的,所以它跨平台
使用简单--与ant的兄弟make比起来
语法清晰--同样是和make相比
功能强大--ant能做的事情很多,可能你用了很久,你仍然不知道它能有多少功能。当你自己开发一些ant插件的时候,你会发现它更多的功能。

3.4,ant的兄弟make

ant做的很多事情,大部分是曾经有一个叫make的所做的,不过对象不同,make更多应用于c/c++ ,ant更多应用于Java。当然这不是一定的,但大部分人如此。

3.5,体验ant

就像每个语言都有HelloWorld一样,一个最简单的应用能让人感受一下Ant

1,首先你要知道你要干什么,我现在想做的事情是:
编写一些程序
编译它们
把它打包成jar包
把他们放在应该放置的地方
运行它们
这里为了简单起见只写一个程序,就是HelloWorld.java程序代码如下:
package test.ant;public class HelloWorld{      public static void main( String args[] )      {           System.out.println("Hello world. ");      }}

2,为了达到上边的目的

你可以手动的用javac 、copy 、jar、java来完成,但是考虑一下如果你有成百上千个类,在多次调试,部署的时候,一次次的javac 、copy、jar、
java那将是一份辛苦的工作。现在看看ant怎么优雅的完成它们。
要运行ant需要有一个build.xml虽然不一定要叫这个名字,但是建议你这么做,下边就是一个完整的build.xml,然后我们来详细的解释每一句:

<?xml version="1.0" encoding="UTF-8" ?><project name="HelloWorld" default="run" basedir="."><property name="src" value="src"/><property name="dest" value="classes"/><property name="hello_jar" value="hello1.jar"/><target name="init">   <mkdir dir="${dest}"/></target><target name="compile" depends="init">   <javac srcdir="${src}" destdir="${dest}"/></target><target name="build" depends="compile">   <jar jarfile="${hello_jar}" basedir="${dest}"/></target><target name="run" depends="build">   <java classname="test.ant.HelloWorld" classpath="${hello_jar}"/></target><target name="clean">   <delete dir="${dest}" />   <delete file="${hello_jar}" /></target><target name="rerun" depends="clean,run">   <ant target="clean" />   <ant target="run" /></target></project>

解释:
<?xml version="1.0" encoding="UTF-8" ?> 
build.xml中的第一句话,没有实际的意义
<project name="HelloWorld" default="run" basedir="."></project>
ant的所有内容必须包含在这个里边,name是你给它取的名字,basedir故名思意就是工作的根目录 .代表当前目录。default代表默认要做的事情。
<property name="src" value="src"/>
类似程序中的变量,为什么这么做想一下变量的作用
<target name="compile" depends="init">   <javac srcdir="${src}" destdir="${dest}"/></target>
把你想做的每一件事情写成一个target ,它有一个名字,depends是它所依赖的target,在执行这个target 例如这里的compile之前ant会先检查init是否曾经被执行过,如果执行
过则直接直接执行compile,如果没有则会先执行它依赖的target例如这里的init,然后在执行这个target
如我们的计划
编译:
<target name="compile" depends="init"><javac srcdir="${src}" destdir="${dest}"/></target>
做jar包:
<target name="build" depends="compile"><jar jarfile="${hello_jar}" basedir="${dest}"/></target>
运行:
<target name="run" depends="build"><java classname="test.ant.HelloWorld" classpath="${hello_jar}"/></target>
为了不用拷贝,我们可以在最开始定义好目标文件夹,这样ant直接把结果就放在目标文件夹中了
新建文件夹:
<target name="init"><mkdir dir="${dest}"/></target>
为了更多一点的功能体现,又加入了两个target
删除生成的文件
<target name="clean"><delete dir="${dest}" /><delete file="${hello_jar}" /></target>
再次运行,这里显示了如何在一个target里边调用其他的target
<target name="rerun" depends="clean,run"><ant target="clean" /><ant target="run" /></target>
好了,解释完成了,下边检验一下你的ant吧
新建一个src的文件夹,然后把HelloWorld.java按照包目录放进去
做好build.xml文件
在命令行下键入ant ,你会发现一个个任务都完成了。每次更改完代码只需要再次键入ant
有的时候我们可能并不想运行程序,只想执行这些步骤中的某一两个步骤,例如我只想重新部署而不想运行,键入
ant build
ant中的每一个任务都可以这样调用ant + target name
好了,这样一个简单的ant任务完成了。



原创粉丝点击