前天公司给任务,用ant写个build.xml把项目编译出来,以前倒是用过那么一次,当时也就做了一例子,现在也忘的差不多了,这俩天算是检回来,下面是我做出来后的一些心得一笔记,供自己复习,如果有些地方能帮到人的那最好.
ant实际上是把java在命令行下的java,javac,javadoc 这些命令集成到它(缺省为build.xml)下面了,当然不止这些命令,只是举个例子.
当编译build.xml时,ant就在dos命令下把程序员在build.xml里面执行的任务解析出来.
所以可以把ant看成是jdk和dos的一个中间件,在没有ant和make等之前,直接在dos编译,在有ant后,以jdk为基础,通过build.xml向dos发送命令完成任务(target),这是整体的理解.
我项目里大概分为以下几个步骤:
1.clear:清空编译后的项目和war包.
2.init:建编译时需要的目录.
3.copy:把jsp,javascript等文件直接copy到编译后的项目里(该项目和webapps/下面的结构一样).
4.compile:执行编译.
5.war:打war包.
当然还有一些其他的功能,比如上传file,打jar包的等.
在这几个步骤中遇到一些问题,需要注意的列出来:
1.project下的basedir属性:通常定位为. 表示前目录,也就是build.xml所在的目录.也可以定义其他目录为根目录.
2.compile时,如果出现编码问题,则设置 <compilerarg line="-encoding UTF-8 "/>
3.如果报错为编码问题UTF-8 则把文件里的内容copy出来再重新建一个, 再重新copy进去就OK!
4.classpath类路径指的jar包的路径.在<target classpathref = "id">
<path id = "id">
......设置classpath路径
<fileset dir = "${classpath}/lib"/>
</path>
5.tomcat下的servlet-api.jar包和jsp-api.jar包需要从tomcat里导,或者拷贝到项目里面 把tomcat/common/lib下的2个jar删掉,不然出现冲突,导致加载不了.
6.注意:类不安全问题通过下面这个命令查看,一般是没有定义范型.
<compilerarg value="-Xlint:unchecked"/>
7.打war包时,出现The name is undefined 则检查<war>是否包住了<lib>和<classes></war>
我就是写错了<war/><classes/><lib/>导致花了一晚上没找到.
8.从命令行传递参数:ant buildfile test.xml -Dversion=1.1 war
上面的意思是编译test.xml的文件,version的值为1.1 编译到target为war的任务为止.
接参数时用<property name = "version" value = "xxx"/>
如果没传参默认为xxx 传了以后${version}值就为1.1
9.判断用<condition name = "test">这里面有<equals>判断字符串,其他的可以判断图片等...</condition>
此时test有值.为true或者false
<target if = "test" >
则为true时编译这个任务.
或者 unless = "test"
则为false时编译这个任务.