java - Ant 和 Maven 之间的差异

标签 java maven-2 ant build-management

关闭。这个问题需要更多focused .它目前不接受答案。












想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post .

7年前关闭。



Improve this question




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

最佳答案

Maven: The Definitive Guide ,我在介绍中写了Maven和Ant的区别,章节标题是"The Differences Between Ant and Maven" .这是一个答案,它结合了该介绍中的信息和一些附加说明。

简单比较

我向您展示这个只是为了说明在最基本的层面上,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 示例中,您可以看到如何准确地告诉 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 site,然后在 target/site 中找到一个 index.html 文件,其中包含指向 JavaDoc 的链接和一些关于您的源代码的报告。

诚然,这是最简单的示例项目。仅包含源代码并生成 JAR 的项目。遵循 Maven 约定且不需要任何依赖项或自定义的项目。如果我们想开始自定义行为,我们的 pom.xml 会变大,在最大的项目中,您可以看到非常复杂的 Maven POM 集合,其中包含大量插件自定义和依赖声明。但是,即使您的项目的 POM 文件变得更加庞大,它们也包含与使用 Ant 的类似大小项目的构建文件完全不同的信息。 Maven POM 包含声明:“这是一个 JAR 项目”和“源代码在 src/main/java 中”。 Ant 构建文件包含明确的说明:“这是项目”、“源代码在 src/main/java 中”、“针对此目录运行 javac”、“将结果放入 target/classses”、“从 . ...”等。在 Ant 必须明确说明过程的地方,Maven 有一些“内置”的东西,它只知道源代码在哪里以及应该如何处理。

高层对比

这个例子中 Ant 和 Maven 的区别是什么? Ant ...
  • 没有像公共(public)项目目录结构这样的正式约定,您必须确切地告诉 Ant 在哪里可以找到源代码以及在哪里放置输出。随着时间的推移,非正式约定已经出现,但它们还没有被编入产品中。
  • 是程序性的,您必须确切地告诉 Ant 做什么以及什么时候做。你必须告诉它编译,然后复制,然后压缩。
  • 没有生命周期,您必须定义目标和目标依赖项。您必须手动将一系列任务附加到每个目标。

  • 马文在哪里...
  • 有约定,它已经知道你的源代码在哪里,因为你遵循了约定。它将字节码放在目标/类中,并在目标中生成一个 JAR 文件。
  • 是声明性的。您所要做的就是创建一个 pom.xml 文件并将您的源代码放在默认目录中。 Maven 负责其余的工作。
  • 有一个生命周期,你在执行 mvn install 时调用它.这个命令告诉 Maven 执行一系列序列步骤,直到它到达生命周期。作为整个生命周期旅程的一个副作用,Maven 执行了许多默认插件目标,这些目标执行诸如编译和创建 JAR 之类的事情。

  • Ivy 呢?

    是的,所以像 Steve Loughran 这样的人会阅读这个比较并判罚犯规。他将谈论答案如何完全忽略称为 Ivy 的东西,以及 Ant 可以在最新版本的 Ant 中重用构建逻辑的事实。这是真实的。如果你有一群聪明的人使用 Ant + antlibs + Ivy,你最终会得到一个设计良好、有效的构建。尽管如此,我非常相信 Maven 是有道理的,我很乐意将 Ant + Ivy 与一个拥有非常敏锐的构建工程师的项目团队一起使用。话虽如此,我确实认为您最终会错过许多有值(value)的插件,例如 Jetty 插件,并且随着时间的推移,您最终会做大量不需要做的工作。

    比 Maven 与 Ant 更重要
  • 是您使用存储库管理器来跟踪软件工件。我建议 downloading Nexus .您可以使用 Nexus 来代理远程存储库,并为您的团队提供一个部署内部工件的地方。
  • 你有适当的软件组件模块化。一个大的单体组件很少随时间扩展。随着您的项目的发展,您将需要模块和子模块的概念。 Maven 非常适合这种方法。
  • 您为构建采用了一些约定。即使您使用 Ant,您也应该努力采用与其他项目一致的某种形式的约定。当一个项目使用 Maven 时,这意味着任何熟悉 Maven 的人都可以选择构建并开始运行它,而无需为了弄清楚如何让事物进行编译而摆弄配置。
  • 关于java - Ant 和 Maven 之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/603189/

    相关文章:

    java - 将格式化电子邮件 (HTML) 转换为纯文本?

    java - spymemcache - MemcachedClient 是否具有内置连接池?

    java - NullPointerException,集合不存储数据?

    maven - 无法执行目标 org.apache.maven.plugins :maven-surefire-plugin:2. 10:test

    java - 如何将外部jar文件添加到maven

    java - 创建 Java 应用程序的不同构建版本

    java - 为循环优化 JSonArray

    maven-2 - 要使用的主要/最佳 Maven 存储库是什么?

    ant - 如何从 ant exec 任务运行多个命令

    ant - 如何在 Cobertura 的 jar 中仅检测特定类?