一、ant
一个ant工具所使用的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="jarfile" value="hello.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="${jarfile}" basedir="${dest}"/>
</target>
<target name="test" depends="build">
<java classname="test.ant.HelloWorld" classpath="${hello_jar}"/>
</target>
<target name="clean">
<delete dir="${dest}" />
<delete file="${hello_jar}" />
</target>
</project>
解释:ant定义了五个任务,init, compile, build, test, clean,打包之前要先编译,所以通过depends来指定依赖的路径。如果在命令行里执行ant build,那就会先执行compile,而compile又依赖于init,所以就会先执行init。有了这个东西以后,我们只要一条命令:ant test,就可以执行编程,打包,测试了。为开发者带来了很大的便利。
缺陷:那就是没办法管理依赖。我们一个工程,要使用很多第三方工具,每次打包都要自己手动去把正确的版本拷到lib下面去,不用说,这个工作既枯燥还特别容易出错。为了解决这个问题,maven闪亮登场。
二、Maven
改进:maven最核心的改进就在于提出仓库这个概念。我可以把所有依赖的包,都放到仓库里去,在我的工程管理文件里,标明我需要什么什么包,什么什么版本。在构建的时候,maven就自动帮我把这些包打到我的包里来了。
<?xml version="1.0" encoding="utf-8"?>
<project ...xmlns...>
<groupId>cn.hinus.recruit</groupId>
<artifactId>Example</artifactId>
<version>0.1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
</dependencies>
</project>
解释:我就定义了我自己的包的坐标是cn.hinus.recruit:Example:0.1.0-SNAPSHOT,而我的工程要依赖junit:junit:4.10。那么maven就会自动去帮我把junit打包进来。如果我本地没有junit,maven还会帮我去网上下载。下载的地方就是远程仓库,我们可以通过repository标签来指定远程仓库。maven里抛弃了ant中通过target定义任务的做法,而是引入了生命周期的概念
缺陷:1)maven是使用xml进行配置的,语法不简洁;
2)maven在约定优于配置这条路上走太远了。就是说,maven不鼓励你自己定义任务,它要求用户在maven的生命周期中使用插件的方式去工作。说通俗一点,就是我使用maven的话,想灵活地定义自己的任务是不行的。基于这个原因,gradle做了很多改进。
三、gradle
gradle并不是另起炉灶,它充分地使用了maven的现有资源。继承了maven中仓库,坐标,依赖这些核心概念。文件的布局也和maven相同。但同时,它又继承了ant中target的概念,我们又可以重新定义自己的任务了。(gradle中叫做task)
一个ant工具所使用的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="jarfile" value="hello.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="${jarfile}" basedir="${dest}"/>
</target>
<target name="test" depends="build">
<java classname="test.ant.HelloWorld" classpath="${hello_jar}"/>
</target>
<target name="clean">
<delete dir="${dest}" />
<delete file="${hello_jar}" />
</target>
</project>
解释:ant定义了五个任务,init, compile, build, test, clean,打包之前要先编译,所以通过depends来指定依赖的路径。如果在命令行里执行ant build,那就会先执行compile,而compile又依赖于init,所以就会先执行init。有了这个东西以后,我们只要一条命令:ant test,就可以执行编程,打包,测试了。为开发者带来了很大的便利。
缺陷:那就是没办法管理依赖。我们一个工程,要使用很多第三方工具,每次打包都要自己手动去把正确的版本拷到lib下面去,不用说,这个工作既枯燥还特别容易出错。为了解决这个问题,maven闪亮登场。
二、Maven
改进:maven最核心的改进就在于提出仓库这个概念。我可以把所有依赖的包,都放到仓库里去,在我的工程管理文件里,标明我需要什么什么包,什么什么版本。在构建的时候,maven就自动帮我把这些包打到我的包里来了。
<?xml version="1.0" encoding="utf-8"?>
<project ...xmlns...>
<groupId>cn.hinus.recruit</groupId>
<artifactId>Example</artifactId>
<version>0.1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
</dependencies>
</project>
解释:我就定义了我自己的包的坐标是cn.hinus.recruit:Example:0.1.0-SNAPSHOT,而我的工程要依赖junit:junit:4.10。那么maven就会自动去帮我把junit打包进来。如果我本地没有junit,maven还会帮我去网上下载。下载的地方就是远程仓库,我们可以通过repository标签来指定远程仓库。maven里抛弃了ant中通过target定义任务的做法,而是引入了生命周期的概念
缺陷:1)maven是使用xml进行配置的,语法不简洁;
2)maven在约定优于配置这条路上走太远了。就是说,maven不鼓励你自己定义任务,它要求用户在maven的生命周期中使用插件的方式去工作。说通俗一点,就是我使用maven的话,想灵活地定义自己的任务是不行的。基于这个原因,gradle做了很多改进。
三、gradle
gradle并不是另起炉灶,它充分地使用了maven的现有资源。继承了maven中仓库,坐标,依赖这些核心概念。文件的布局也和maven相同。但同时,它又继承了ant中target的概念,我们又可以重新定义自己的任务了。(gradle中叫做task)
转载:https://zhuanlan.zhihu.com/p/24429133?refer=hinus