linux-ant

ant初识

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

1,我的ant HelloWorld

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]$ ant
Buildfile: /home/xxx/test/src/build.xml

init:
    [mkdir] Created dir: /home/xxx/test/src/classes

compile:
    [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/classes

build:
      [jar] Building jar: /home/xxx/test/src/hello.jar

run:
     [java] Hello world.

BUILD SUCCESSFUL
Total 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任务完成了。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值