3年前我开始使用Ant,当时觉得它十分方便,配置文件的自由拷贝、源码目录的自由选择、多版本jdk的打包在一个build.xml中就可以搞定,再也不用贴来岾去的修改eclipse导出的war包了。项目内的目录可以根据不同需要去分类,最后在build.xml文件中融合。
3年后,通过一个项目我使用了maven,只是一次接触就让我放弃了Ant 我变心了!!
它们各自有各自的优点,针对不同的需求可以选择不同的编译器。
我觉得ANT更适合框架类的开发,在一个项目中有多个功能的子模块,每一个子模块都需要打包成jar包提供给外部使用。最典型的例子就是commons-*.jar,当我们要使用DBCP数据库连接池时,在我们的项目中便需要添加commons-logging.jar、commons-dbcp.jar等等。commons就是一个项目的名称,而logging、dbcp就是他的子模块,我们可以在build.xml中配置,当我们需要打包logging的时候只需要将org.commons.logging的源代码拷贝到build目录下编译打包就可以了,当我们再需要编译dbcp模块的时候也只是提取dbcp目录下的源码即可,它们互不干扰各自独立。
ANT的每一步操作都是一组
放弃ANT的主要原因在于LIB的使用,我们每开发一个项目都需要去配置环境变量、引入第三方JAR包以及最后打成jar或war包。如果我希望JAR不要冗余,那么我会创建一个目录将所有的JAR放到统一的目录里,通过eclipse引入所需要的JAR包;更甚至在eclipse里创建一个公共的User Liberay,直接引入这个lib变量。一个工具类或框架类的app项目会这样使用,当它再将自己打包成jar时它可以不包含其它的jar包,但是对于WEB项目或者可执行类的JAR包时,这种引入的方式便显得力不从心了。WEB项目我们还可以将jar包拷贝到web-inf\lib目录下,然后通过eclipse将lib目录引入到项目中。可是,无论开发哪种项目,在使用ANT编译打包时都需要重新配置。相对来讲WEB项目还容易一些,只需要将lib目录添加到build.xml即可,要是打包可执行类的Jar包,嘿嘿~~!!你必须将第三方的jar包全称都添加到build.xml中,错一个字都不行
而MAVEN最大的特点就是它的LIB仓库,一次配置终(you)身(dian)受(kua)用(zhang)。maven有个世界级的lib仓库它是开源的,任何公司或个人都可以向内添加自己的jar包,然后生成唯一的标签信息以供其它开发者来使用。当然你也可以在公司内部建立一个小型的局域仓库将公用的jar包以及内部框架放在上面供开发人员使用,避免网络的瓶颈重复下载。而开发者,当你需要使用某个jar时,只需要将对应的标签添加到pom.xml文件中,maven就可以帮你去搜寻、下载、配置环境等不用重(lan)复(de)配(yao)置(si),当然你也可以使用web-inf\lib下的jar,同样也是只配置一次就可以完成配置环境、编译、打包的工作。
例举ANT与MAVEN的配置
ANT
basedir="." default="usage" name="Biz">
name="init">
name="Name" value="Biz" />
name="name" value="biz" />
name="version" value="1025" />
name="year" value="2014" />
message="----------- ${Name} ${version} [${year}] ------------" />
name="debug" value="on" />
name="optimize" value="on" />
name="deprecation" value="on" />
name="base.src.dir" value="${basedir}/src" />
name="webroot" value="${basedir}/WebRoot" />
name="JAR" value="${basedir}/WebRoot/WEB-INF/lib" />
name="ant.build" value="${basedir}/AntBuild/build" />
name="ant.bin" value="${basedir}/AntBuild/bin" />
name="ant.dest" value="${basedir}/AntBuild/dest" />
name="ant.warsrc" value="${basedir}/AntBuild/warsrc" />
name="ant.warsrc.WEB-INF" value="${ant.warsrc}/WEB-INF" />
name="ant.doc" value="${basedir}/AntBuild/doc" />
name="ant.jar" value="${basedir}/AntBuild/jar" />
name="ant.war" value="${basedir}/AntBuild/war" />
name="tomcat.home" value="D:\java\Tomcat" />
id="classpath.app">
dir="${JAR}">
name="**/*.jar" />
id="classpath.web">
dir="${JAR}">
name="**/*.jar" />
dir="${ant.warsrc.WEB-INF}/lib/">
name="**/*.jar" />
token="year" value="${year}" />
token="version" value="${version}" />
token="date" value="${TODAY}" />
token="log" value="true" />
token="verbose" value="true" />
name="prepare-mkdir" depends="usage,clean">
dir="${ant.build}" />
dir="${ant.bin}" />
dir="${ant.jar}" />
dir="${ant.dest}" />
dir="${ant.war}" />
dir="${ant.warsrc}" />
name="prepare-service" depends="prepare-mkdir">
todir="${ant.build}">
dir="${base.app.dir}">
name="**/wy/app/service/**" />
name="prepare-webcode" depends="prepare-mkdir">
todir="${ant.build}">
dir="${base.web.dir}">
name="**/my/**" />
name="*.xml" />
name="*.properties" />
name="prepare-webroot" depends="prepare-webcode">
dir="${ant.warsrc.WEB-INF}" />
dir="${ant.warsrc.WEB-INF}/classes" />
dir="${ant.warsrc.WEB-INF}/lib" />
todir="${ant.warsrc.WEB-INF}">
dir="${webroot}/WEB-INF">
name="**/web.xml" />
todir="${ant.warsrc.WEB-INF}/classes">
dir="${base.web.dir}">
name="*.xml" />
name="*.properties" />
todir="${ant.warsrc.WEB-INF}/lib/">
dir="${JAR}">
name="log4j-1.2.9.jar" />
name="ojdbc14_10g.jar" />
name="jdom.jar" />
name="commons-dbcp-1.2.1.jar" />
name="commons-pool-1.2.jar" />
name="commons-collections-3.1.jar" />
dir="${JAR}/proxool-0.9.1/lib">
name="proxool-0.9.1.jar" />
name="proxool-cglib.jar" />
file="${ant.jar}/${name}-${version.app}.jar">
dir="${ant.jar}">
name="**/${name}.jar" />
name="prepare-web-style2" depends="prepare-webroot">
todir="${ant.warsrc}" overwrite="true">
dir="${style2.dir}">
name="**/assets/**"/>
name="**/build/**"/>
name="**/demo/**"/>
name="prepare-web-style3" depends="prepare-webroot">
todir="${ant.warsrc}" overwrite="true">
dir="${style3.dir}">
name="prepare-web-style4" depends="prepare-webroot">
todir="${ant.warsrc}" overwrite="true">
dir="${style4.dir}">
name="build.app" depends="init">
srcdir="${ant.build}" destdir="${ant.dest}" debug="${debug}" includeantruntime="false" optimize="${optimize}" encoding="utf-8" target="1.5">
refid="classpath.app" />
name="build.web" depends="usage">
srcdir="${ant.build}" destdir="${ant.warsrc.WEB-INF}/classes" debug="${debug}" optimize="${optimize}" encoding="utf-8" target="6.0">
refid="classpath.web" />
name="WAR" >
warfile="${ant.war}/${Name}.war" webxml="${ant.warsrc.WEB-INF}/web.xml">
dir="${ant.warsrc.WEB-INF}/lib" />
dir="${ant.warsrc.WEB-INF}/classes" />
dir="${ant.warsrc}">
name="jar.myapp" depends="build.app">
jarfile="${ant.jar}/${name}-${version.app}.jar" basedir="${ant.dest}" includes="**/*.*">
name="Version" value="${version.app}"/>
name="Author" value="Amkio.wu"/>
name="jar.myapp.service" depends="prepare-app-service,build.app">
jarfile="${ant.jar}/${name}-service.jar" basedir="${ant.dest}" includes="**/*.*">
name="Version" value="${version.app}" />
name="Author" value="wuhan" />
name="jar.myapp.sub" depends="prepare-app-sub,build.app">
jarfile="${ant.jar}/${name}-${base.app.subdir}.jar" basedir="${ant.dest}" includes="**/*.*">
name="Version" value="${version.app}" />
name="Author" value="wuhan" />
name="jar.run" depends="build.web">
jarfile="${dist}/${name.run}.jar" basedir="${ant.dest}" includes="**/*.*">
name="Main-Class" value="${main-class}" />
name="Class-Path" value="${class_path}" />
name="clean" depends="init">
dir="${ant.build}" />
dir="${ant.bin}/org" />
dir="${ant.bin}/com" />
dir="${ant.dest}" />
dir="${ant.warsrc}" />
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<groupId>myappgroupId>
<artifactId>wy.appartifactId>
<version>0.0.3version>
<packaging>warpackaging>
<build>
<resources>
<resource>
<directory>src/main/javadirectory>
<includes>
<include>**/*.xmlinclude>
<include>**/*.propertiesinclude>
includes>
resource>
<resource>
<directory>src/main/resourcesdirectory>
<includes>
<include>**/*.xmlinclude>
includes>
resource>
resources>
<plugins>
<plugin>
<artifactId>maven-compiler-pluginartifactId>
<configuration>
<source>1.6source>
<target>1.6target>
<encoding>UTF-8encoding>
configuration>
plugin>
<plugin>
<artifactId>maven-resources-pluginartifactId>
<configuration>
<encoding>UTF-8encoding>
configuration>
plugin>
<plugin>
<artifactId>maven-site-pluginartifactId>
<configuration>
<locales>enlocales>
<inputEncoding>UTF-8inputEncoding>
<outputEncoding>UTF-8outputEncoding>
configuration>
plugin>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-jar-pluginartifactId>
<version>2.2version>
<configuration>
<archive>
<manifestEntries>
<Svn-Revision>${SVN_REVISION}Svn-Revision>
<Build-Tag>${BUILD_TAG}Build-Tag>
<Build-Number>${BUILD_NUMBER}Build-Number>
<Build-Id>${BUILD_ID}Build-Id>
manifestEntries>
archive>
configuration>
plugin>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-war-pluginartifactId>
<configuration>
<archiveClasses>truearchiveClasses>
<archive>
<manifest>
<addClasspath>trueaddClasspath>
<classpathPrefix>lib/classpathPrefix>
manifest>
<manifestEntries>
<Specification-Title>${project.name}Specification-Title>
<Specification-Version>${project.version}Specification-Version>
<Svn-Revision>${SVN_REVISION}Svn-Revision>
<Build-Tag>${BUILD_TAG}Build-Tag>
<Build-Number>${BUILD_NUMBER}Build-Number>
<Build-Id>${BUILD_ID}Build-Id>
manifestEntries>
archive>
configuration>
plugin>
plugins>
build>
<dependencies>
<dependency>
<groupId>commons-dbcpgroupId>
<artifactId>commons-dbcpartifactId>
<version>1.4version>
dependency>
<dependency>
<groupId>commons-poolgroupId>
<artifactId>commons-poolartifactId>
<version>1.2version>
dependency>
<dependency>
<groupId>log4jgroupId>
<artifactId>log4jartifactId>
<version>1.2.14version>
<scope>compilescope>
dependency>
<dependency>
<groupId>commons-langgroupId>
<artifactId>commons-langartifactId>
<version>2.6version>
dependency>
<dependency>
<groupId>javax.servletgroupId>
<artifactId>jstlartifactId>
<version>1.2version>
dependency>
dependencies>
<name>wy-appname>
project>