以前使用make编译安装tar包源码的时候对自动化构建(autobuild)这种概念还没有什么意识,后来彻底放弃了C/C++老牌编译语言转投脚本开发之后,更是觉得make这种形式的工具就是一款用于源码编译领域脚本的简单实现,有研究MAKEFILE的功夫还不如自己写perl脚本来的快,在加上脚本的世界也不需要自动化构建,写脚本代码的时候就要实现脚本程序的相应结构,因此在没有深入使用java的情况下觉得ant/maven之类的构建工具没有了解的意义 ,直到后来接触到现代软件流水线CI之后才真正意识到专用自动化构建工具存在的必要性,在当今代码多人开发维护以及离线开发在线发布的背景下使用一款构建工具对提升效率有着积极的作用。
简单的讲,自动化构建主要针对编译语言(C/C++)或者半编译语言(Java),像即写即用的脚本语言从编译到部署不怎么需要工作量,常说的构建(build)是个广义概念,从细节上可分为编译(compile),集成(build),部署(deploy)等阶段,make工具主要针对C/C++源码的自动化构建,执行时首先对源码文件进行编译生成二进制代码,然后按照设计构建程序对应的文件结构,最后拷贝到相应的目标文件夹部署到系统中。ant和maven工具主要应用于java,其中ant类似于make,或者可以称为java的make工具,maven的理念比ant要高级,增添了仓库的概念也实现了一个质的飞跃。
安装ant
ant的安装特别简单,从ant的官网上下载binary distribution,解压到任意文件夹下然后将该文件夹下的bin
子文件夹路径添加到PATH
环境变量中即可使用ant命令,官网地址:http://ant.apache.org/bindownload.cgi,可以使用ant -h
验证是否部署成功。
localhost:ant ftericsson$ ant -h
/Users/ftericsson/Downloads/apache-ant-1.10.1/bin/ant [script options] [options] [target [target2 [target3] ..]]
使用ant
ant的使用类似于make,通过自定义的buildfile实现一系列的自动构建操作,不同于make工具只能使用MAKEFILE文件,ant除了在执行目录下寻找默认的build.xml作为buildfile之外还能通过-buildfile/-file/-f参数指定任意路径任意名称的xml文件。
ant -buildfile/-file/-f /path/file.xml <target_name>
ant buildfile
<?xml version="1.0"?>
<project name="try" default="run" basedir="./">
<property name="src" value="source" />
<property name="dest" value="classes" />
<property name="jar" value="try.jar" />
<target name="desc">
<echo message="first trail for ant tool!" />
</target>
<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="${jar}" basedir="${dest}" />
</target>
<target name="run" depends="build">
<java classname="main.print" classpath="${jar}" />
</target>
<target name="clean">
<delete dir="${dest}" />
<delete file="${jar}" />
</target>
<target name="rerun" depends="run,clean">
<ant antfile="try.xml" target="run" />
<ant antfile="try.xml" target="clean" />
</target>
</project>
上面的例子中的buildefile内容很简单,主要通过三个标签来实现构建功能,其中<poject>
定义项目的相关属性,<property>
定义相关变量值,<target>
最为重要,定义构建行为,通过target name调用。更多ant的功能可以参考ant官方的文档。
在当前目录下新建source文件夹,其下建立print.java文件,使用print打印一条消息。
localhost:main ftericsson$ cat print.java
package main;
public class print{
public static void main(String[] args){
System.out.println("call the system print function!");
}
}
然后执行ant -f try.xml
输出如下:
Buildfile: /Users/ftericsson/Desktop/ant/try.xml
init:
[mkdir] Created dir: /Users/ftericsson/Desktop/ant/classes
compile:
[javac] Compiling 1 source file to /Users/ftericsson/Desktop/ant/classes
build:
[jar] Building jar: /Users/ftericsson/Desktop/ant/try.jar
run:
[java] call the system print function!
BUILD SUCCESSFUL
Total time: 0 seconds