<project name="my-project" default="dist" basedir=".">
<description>
simple example build file
</description>
<!-- set global properties for this build -->
<property name="src" location="src/main/java"/>
<property name="build" location="target/classes"/>
<property name="dist" location="target"/>
<target name="init">
<!-- Create the time stamp -->
<tstamp/>
<!-- Create the build directory structure used by compile -->
<mkdir dir="${build}"/>
</target>
<target name="compile" depends="init"
description="compile the source " >
<!-- Compile the java code from ${src} into ${build} -->
<javac srcdir="${src}" destdir="${build}"/>
</target>
<target name="dist" depends="compile"
description="generate the distribution" >
<!-- Create the distribution directory -->
<mkdir dir="${dist}/lib"/>
<!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file
-->
<jar jarfile="${dist}/lib/MyProject-${DSTAMP}.jar" basedir="${build}"/>
</target>
<target name="clean"
description="clean up" >
<!-- Delete the ${build} and ${dist} directory trees -->
<delete dir="${build}"/>
<delete dir="${dist}"/>
</target>
</project>
# 1 楼答案
Maven or Ant?是一个非常类似于这个问题的问题,它应该可以帮助你回答你的问题
在官方网站上
编辑:对于一个新的/greenfield项目,我建议使用Maven:“约定优先于配置”将为您节省大量编写、设置构建和部署脚本的时间。使用ant时,构建脚本的长度和复杂性会随着时间的推移而增加。对于现有项目,很难将它们的配置/布局硬塞进Maven系统
# 2 楼答案
我只想列出更多的区别:
更新:
这来自Maven: The Definitive Guide。对不起,我完全忘了引用它
# 3 楼答案
Ant主要是一个构建工具
Maven是一个项目和依赖项管理工具(当然,它也会构建您的项目)
如果你想避开Maven,Ant+Ivy是一个很好的组合
# 4 楼答案
在Maven: The Definitive Guide中,我在导言中写到了Maven和Ant之间的差异,该部分的标题是"The Differences Between Ant and Maven"。下面是一个答案,它结合了介绍中的信息和一些额外的注释
一个简单的比较
我向你们展示这一点只是为了说明,在最基本的层面上,Maven有内置的约定。下面是一个简单的Ant构建文件:
在这个简单的Ant示例中,您可以看到如何准确地告诉Ant该做什么。有一个编译目标,包括将src/main/java目录中的源代码编译到target/classes目录的javac任务。您必须准确地告诉Ant您的源代码在哪里,您希望生成的字节码存储在哪里,以及如何将这一切打包到JAR文件中。虽然最近的一些开发有助于减少Ant的程序性,但开发人员使用Ant的经验是编写用XML编写的程序性语言
将前面的Ant示例与Maven示例进行对比。在Maven中,要从一些Java源代码创建JAR文件,只需创建一个简单的pom。xml,将源代码放在${basedir}/src/main/java中,然后从命令行运行mvn install。例如Maven pom。实现相同结果的xml
这就是你的pom所需要的。xml。从命令行运行mvn install将处理资源、编译源代码、执行单元测试、创建JAR,并将JAR安装到本地存储库中,以便在其他项目中重用。无需修改,就可以运行mvn站点,然后找到索引。目标/站点中的html文件,其中包含指向JavaDoc的链接和一些关于源代码的报告
诚然,这是最简单的示例项目。只包含源代码并生成JAR的项目。遵循Maven约定,不需要任何依赖项或定制的项目。如果我们想开始定制行为,我们的pom。xml的规模将越来越大,在最大的项目中,你可以看到非常复杂的Maven POM集合,其中包含大量插件定制和依赖声明。但是,即使您的项目的POM文件变得更加充实,它们所包含的信息也与使用Ant的大小类似的项目的构建文件完全不同。Maven POM包含声明:“这是一个JAR项目”,以及“源代码在src/main/java中”。Ant构建文件包含明确的指令:“这是项目”、“源代码在
src/main/java
”、“对该目录运行javac
”、“将结果放在target/classses
”、“从..创建JAR”,在Ant必须明确流程的地方,Maven有一个“内置”的东西,它只知道源代码在哪里以及应该如何处理高层比较
本例中Ant和Maven之间的区别是什么?蚂蚁
在那里Maven
常春藤呢
是的,像史蒂夫·洛夫兰这样的人会读到这个比较,并称其为犯规。他将讨论答案如何完全忽略了一个叫做常春藤的东西,以及Ant可以在最近的Ant版本中重用构建逻辑的事实。这是真的。如果你有一群聪明的人在使用Ant+antlibs+Ivy,你最终会得到一个设计良好、运行良好的构建。尽管如此,我非常相信Maven是有道理的,但我很乐意将Ant+Ivy与一个拥有非常敏锐的构建工程师的项目团队一起使用。话虽如此,我确实认为你最终会错过一些有价值的插件,比如Jetty插件,你最终会做很多你不需要做的工作
比Maven vs.Ant更重要
# 5 楼答案
Maven是一个框架,Ant是一个工具箱
Maven是一款预制的公路车,而Ant是一套汽车零件。有了Ant,你必须自己造车,但至少如果你需要越野驾驶,你可以造一辆合适的车
换句话说,Maven是一个框架,而Ant是一个工具箱。如果您满足于在框架的范围内工作,那么Maven会做得很好。对我来说,问题是我不断地撞到框架的边界,它不让我出去
XML详细信息
tobrien是一个非常了解Maven的人,我认为他对这两种产品进行了非常好、诚实的比较。他比较了一个简单的Maven pom。xml和一个简单的Ant构建文件,他提到了Maven项目如何变得更加复杂。我认为,比较一下在一个简单的现实项目中更可能看到的几个文件是值得一看的。下面的文件表示多模块构建中的单个模块
首先,Maven文件:
以及等效的Ant文件:
tobrien用他的例子说明Maven有内置的约定,但这并不一定意味着最终编写的XML更少。我发现事实正好相反。pom。xml的长度是构建的3倍。xml,这是不偏离惯例的。事实上,我的Maven示例没有显示配置插件所需的额外54行代码。那个球。xml用于一个简单的项目。当您开始添加额外的需求时,XML真的开始显著增长,这对于许多项目来说并不常见
但你必须告诉蚂蚁该怎么做
我上面的蚂蚁例子当然不完整。我们仍然需要定义用于清理、编译、测试等的目标。这些目标在一个公共构建文件中定义,该文件由多模块项目中的所有模块导入。这让我想到,所有这些东西都必须在Ant中显式编写,而在Maven中却是声明性的
的确,如果我不必显式地编写这些Ant目标,这将节省我的时间。但是有多少时间?我现在使用的通用构建文件是我5年前写的,从那时起只做了一些细微的改进。在我与Maven进行了两年的实验后,我把旧的Ant构建文件从壁橱里拿出来,掸掉灰尘,然后重新开始工作。对我来说,在5年的时间里,明确告诉蚂蚁该做什么的成本加起来不到一周
复杂性
我想提到的下一个主要区别是复杂性及其对现实世界的影响。Maven的目的是减少负责创建和管理构建过程的开发人员的工作量。为了做到这一点,它必须是复杂的。不幸的是,这种复杂性往往会否定他们的预期目标
与Ant相比,Maven项目的构建人员将花费更多时间:
相比之下:
熟悉
另一个区别是熟悉度。新开发人员总是需要时间来跟上进度。在这方面,熟悉现有产品会有所帮助,Maven的支持者正确地宣称这是Maven的一个好处。当然,Ant的灵活性意味着你可以创建任何你喜欢的约定。所以我使用的惯例是将源文件放在一个名为src/main/java的目录中。我编译的类进入一个名为target/classes的目录。听起来很熟悉,不是吗
我喜欢Maven使用的目录结构。我认为这是有道理的。还有他们的构建生命周期。所以我在我的Ant构建中使用相同的约定。这不仅是因为它有意义,而且是因为之前使用过Maven的人都会熟悉它
# 6 楼答案
Maven既是一个依赖关系管理工具(它可以用于从中央存储库或您设置的存储库中检索JAR),也是一个声明性构建工具。“声明式”构建工具与更传统的构建工具(如ant或make)之间的区别在于,您需要配置需要完成的内容,而不是如何完成。例如,可以在maven脚本中说,项目应该打包为WAR文件,maven知道如何处理这个问题
Maven依赖于关于项目目录如何布局的约定,以实现其“声明性”例如,它有一个将主代码放在哪里、将网页放在哪里的约定。xml、单元测试等等,但也提供了在需要时更改它们的能力
您还应该记住,maven中有一个用于运行ant命令的插件:
http://maven.apache.org/plugins/maven-ant-plugin/
此外,maven的原型使项目的启动速度非常快。例如,有一个Wicket原型,它提供了一个maven命令,您可以运行它来获得一个完整的、准备运行hello world类型的项目
https://wicket.apache.org/start/quickstart.html