Ant和Maven之间的区别

问题:

有人可以告诉我Ant和Maven之间的区别吗?我从来没有使用过我明白,它们用于自动化Java项目的构建,但我不知道从哪里开始。

回答:

Maven: The Definitive Guide中,我在介绍部分标题为“The Differences Between Ant and Maven”时,写了Maven和Ant之间的区别。这是一个答案,它是该介绍中的信息与一些额外的注释的组合。
 一个简单的比较
我只是向您展示这一点,以说明在最基本的层面上,Maven内置了约定。这是一个简单的Ant构建文件:

<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>

在这个简单的蚂蚁例子中,您可以看到你必须如何准确地告诉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示例。

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.sonatype.mavenbook</groupId>
  <artifactId>my-project</artifactId>
  <version>1.0</version>
</project>

这就是你在pom.xml中所需要的。从命令行运行mvn install将处理资源,编译源代码,执行单元测试,创建JAR,并将JAR安装在本地存储库中,以便在其他项目中重用。没有修改,您可以运行mvn站点,然后在目标/站点中找到一个index.html文件,其中包含指向JavaDoc的链接和一些关于源代码的报告。
诚然,这是最简单的示例项目。一个仅包含源代码并生成JAR的项目。一个遵循Maven约定的项目,不需要任何依赖或定制。如果我们想要开始定制行为,我们的pom.xml将会发展壮大,在最大的项目中,您可以看到非常复杂的Maven POM集合,它们包含大量的插件定制和依赖关系声明。但是,即使您的项目的POM文件变得更加实质,他们也使用Ant与类似大小的项目的构建文件保存完全不同的信息。 Maven POM包含声明:“这是一个JAR项目”,“源代码在src / main / java”中。 Ant构建文件包含明确的指令:“这是项目”,“源在src/main/java”,“针对此目录运行javac”,“将结果放在target/classses”,“从…创建JAR” …“等等。蚂蚁必须对此过程有所了解,Maven有一些”内置“,只知道源代码在哪里以及应如何处理。
 高层次比较
在这个例子中Ant和Maven的区别?蚂蚁…

  • 没有像常规项目目录结构的正式约定,你必须告诉Ant在哪里找到源和放置输出的位置。随着时间的推移,非正式的惯例已经出现,但它们没有被编入产品。
  • 是程序性的,你必须告诉Ant,该怎么做,什么时候做。你不得不告诉它编译,然后复制,然后压缩。
  • 没有生命周期,你必须定义目标和目标依赖。您必须手动附加一系列任务到每个目标。

哪里Maven …

  • 有惯例,它已经知道你的源代码是在哪里,因为你按照惯例。它将字节码放在目标/类中,并在目标中生成一个JAR文件。
  • 是声明性的所有你需要做的是创建一个pom.xml文件,并将你的源放在默认目录中。 Maven照顾其余的。
  • 有一个生命周期,您在执行mvn install时调用该生命周期。该命令告诉Maven执行一系列序列步骤,直到它达到生命周期。作为这个通过生命周期的旅程的副作用,Maven执行了一些默认插件目标,它们执行编译和创建JAR等操作。

 关于常春藤
对,所以像Steve Loughran这样的人会读这个比较,叫做犯规。他将会讨论如何完全忽略一个叫做Ivy的东西,以及Ant可以在最新版本的Ant中重用构建逻辑。这是真的。如果你有一大堆聪明的人使用Ant + antlibs + Ivy,那么你最终会得到一个精心设计的构建。尽管如此,我非常相信Maven是有道理的,我很高兴地使用Ant + Ivy与一个非常锋利的构建工程师的项目团队。话虽如此,我认为你最终会错过一些有价值的插件,如Jetty插件,你最终会做一整套你不需要做的工作。
 比Maven对Ant更重要

  1. 是使用存储库管理器来跟踪软件工件。我建议downloading Nexus。您可以使用Nexus代理远程存储库,并为您的团队提供部署内部工件的位置。
  2. 您有适当的软件组件模块化。一个大的整体组件很少随着时间的推移而增长。随着您的项目开发,您将需要具有模块和子模块的概念。 Maven非常适合这种做法。
  3. 您为您的构建采用一些约定。即使你使用Ant,也应该努力采用与其他项目一致的某种形式的约定。当一个项目使用Maven时,这意味着任何熟悉Maven的人都可以拿起构建并开始运行,而无需调整配置,只是为了弄清楚如何编译。

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Differences between Ant and Maven

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

33 + = 36