冰浪

哥已不再年轻 - 坚定梦想,毕生追求!
posts - 85, comments - 90, trackbacks - 0, articles - 3
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

[原]ANT学习体会

Posted on 2007-01-23 10:52 冰浪 阅读(5505) 评论(8)  编辑  收藏 所属分类: 其它

这几天在公司比较闲,所以决定学习ANT的使用,ANT(another neat tool)是一种快速构建工具,主要用于java,类似于C++的make。ANT功能很强大,但很易于使用。

你们一定很奇怪,既然说它易于使用,为什么我要学几天??呵呵~主要是学习资料不足和自己比较粗心的缘故。

下面我就先把我自己写的build.xml文件拿出来,build.xml文件是作为ANT的buildfile,运行ANT命令时,会默认查找当前目录下的这个文件。
<!--build.xml start-->

<project name="MyProject" default="dist" basedir=".">
    <description>
    simple example build file
 </description>
 <property name="src" location="src"/>
 <property name="build" location="build"/>
    <property name="dist" location="dist"/>
 <property name="myclasspath" location="WebRoot\WEB-INF\classes"/>

    <property name="lib.dir" location="E:\setup\java\jakarta-tomcat-5.0.28\common\lib"/>
 <property name="mylib.dir" location="WebRoot\WEB-INF\lib"/>

    <path id="libAndClass.path">
    <pathelement location="${build}" />
    <fileset dir="${lib.dir}" >
       <include name="**/*.jar" />
    </fileset>
       <fileset dir="${mylib.dir}" >
       <include name="**/*.jar" />
    </fileset>
 </path>

 <target name="init">
   <tstamp/>
   <mkdir dir="${build}"/>

   <echo message="-1- >> Create the class files directory successful!" />
   <echo message="[mkdir] Created dir:${build}" />
 </target>

 <target name="compile" depends="init" description="compile the source">
   <javac srcdir="${src}" destdir="${build}">
     <classpath refid="libAndClass.path" />
   </javac>

   <echo message="-2- >> Compile the java source files to the Build directiory successful!" />
   <echo message="[javac] Compiling all source files to ${build}" />
 </target>

 <target name="dist" depends="compile">
   <mkdir dir="${dist}/lib"/>
   <jar jarfile="${dist}/lib/WebComm-${DSTAMP}.jar" basedir="${build}"/>

   <echo message="-3- >> Create the the project jar file to the Dist directiory successful!" />
      <echo message="[jar] Building jar: ${build}" />
 </target>

 <target name="clean">
   <delete dir="${build}"/>
   <delete dir="${dist}"/>
 </target>

 <target name="copyto">
   <copy todir="${myclasspath}">
     <fileset dir="${build}"/>
      </copy>
 </target>

</project>

<!--build.xml end-->

这个build.xml的主要用于编译*.java文件,主要的target(一项任务)是Compile,因为编译之后还要将之打包,所以将默认target为dist:

<project name="MyProject" default="dist" basedir=".">

=>default="dist"

basedir=".":指明工作路径为当前目录。
按照依赖关系“depends=targetname”,ANT命令会按init,compile,dist的顺序来执行这些target。后面的两个target:clean,copyto并不会执行,需要在命令行下输入:ant targetname的形式才会执行,这两个target的功能是用于删除class文件的文件夹和将这些class文件拷到WEB-INF\classes下。

现在主要讲讲最主要的target:compile,也就是编译。
在java源文件中,我们很多时候都需要要导入一些相关包,所以在用javac编译这些源文件时,需要加上classpath,因此,在用ANT来编译时我们也需要要指定这些jar文件路径,以求顺利通过编译。
我们在前面先定义好我们需要的classpath:

<path id="libAndClass.path">
    <pathelement location="${build}" />
    <fileset dir="${lib.dir}" >
       <include name="**/*.jar" />
    </fileset>
       <fileset dir="${mylib.dir}" >
       <include name="**/*.jar" />
    </fileset>
</path>
 
 id="libAndClass.path"是指定一个id以方便在target里引用。
 
 <pathelement location="${build}" />:是让生成的class类文件也作为以后编译要用到的相关类文件。
   
<fileset dir="${lib.dir}" >
  <include name="**/*.jar" />
</fileset>
是指定本工程项目的WEB-INF\lib下的jar包。

<fileset dir="${mylib.dir}" >
  <include name="**/*.jar" />
</fileset>
指定tomcat下的公共库。

完成后就直接在compile的target里引用:
<javac srcdir="${src}" destdir="${build}">
 <classpath refid="libAndClass.path" />
</javac>

注意,在这里,引用是用refid=idname方式,不然不能正常工作。我就是因为把refid误换成localtion,所以一直不能编译成功。

以上是我在学习ANT中的一些体会,并不是ANT教程,所以没有讲得很细,但看过ANT的基础知识后再看我写的这篇文章,应该就很好理解了,希望对初学者有点帮助。


评论

# re: [原]ANT学习体会  回复  更多评论   

2007-01-23 11:49 by samfree[匿名]
这几天也正好用到ant,便琢磨了一下.遇到了一个问题,向搂主请教一下.
ant的时候,我们需要把cvs下tag文件 copy到jar包里,问题是如果tag文件
不存在的话,就自动生成一个tag,写上当前日期.在tag里该怎样判断文件的存在呢?

# re: [原]ANT学习体会  回复  更多评论   

2007-01-23 12:01 by 冰浪
@samfree[匿名]

我不是很明白你要表达的意思,能说清楚点吗?
给你一个例子,不知能否帮到你:
<condition property="abc.efg">
<and>
<available file="abc.js" filepath="d:/"/>
</and>
</condition>

<target name="your-task" if="abc.efg">
<echo>${abc.efg}</echo>
</target>

根据d:/abc.js文件是否存在来决定your-task任务的执行与否。

# re: [原]ANT学习体会  回复  更多评论   

2007-01-23 14:51 by samfree[匿名]
多谢冰浪,你给的例子非常好,正是我要用的。
<condition property="exist.tag">
<and>
<available file="Tag" filepath="CVS/"/>
</and>
</condition>
<target name="copy" if="exist.tag">
<copy file="CVS/Tag" todir="./"/>
</target>
<target name="nocopy" unless="exist.tag" depends="copy">
<java classname="com.ruanying.pub.Tag">
<classpath>
<pathelement location="${build}"/>
</classpath>
</java>
</target>
如果cvs/tag存在,就把它copy到当前目录下。如果不存在就创建一个tag文件
,并把当前日期写入。我不知道用ant怎么往文件里写东西,所以就调用了一个
类来写东西。不知你有什么别的方法吗?

# re: [原]ANT学习体会  回复  更多评论   

2007-01-23 15:31 by 冰浪
@samfree[匿名]

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

按你的要求,把token属性指定为“”,就是空字符串,然后value属性指定为你要写入的当前日期,不知这样是否可以实现?

# re: [原]ANT学习体会  回复  更多评论   

2007-01-23 23:27 by 小车马
ant非常的简洁,一直用它,呵呵

楼主,潜力贴论坛(http://content.uu1001.com)是我个人的一个设想,如果你对java非常的专注,并且愿意交我这个朋友,可以发邮件给我(lbw070105@gmail.com),希望我们可以一起发展它。

# re: [原]ANT学习体会  回复  更多评论   

2007-01-24 10:47 by samfree[匿名]
谢谢冰浪,问题已经解决了.

# re: [原]ANT学习体会  回复  更多评论   

2007-02-28 15:51 by chin
感谢冰浪的例子,不过我想判断一个目录是否存在,不知道该怎么做。望指教。

# re: [原]ANT学习体会  回复  更多评论   

2008-01-19 11:05 by wanlu
请教一个问题,我想用ant写一个判断语句,判断是否存在某一个目录,若存在则执行target A , 若不存在则执行target B ,帮我看一下我写的是不是对的?

<project name="test" default="testB" basedir=".">
<property name="desturl" value="build/2008/01"/>
<condition property="folderexist">
<and>
<available file="${desturl}" type="dir"/>
</and>
</condition>
<target name="testA" if="folderexist">
<echo message="the folder was exist!"/>
</target>
<target name="testB" unless="folderexist" depends="testA">
<echo message="the folder was not exist"/>
</target>
</project>



只有注册用户登录后才能发表评论。


网站导航: