Java Ant和Maven之间的差异

Java Ant和Maven之间的差异,java,maven-2,ant,build-management,Java,Maven 2,Ant,Build Management,有人能告诉我Ant和Maven的区别吗?我也没用过。我知道它们用于自动化Java项目的构建,但我不知道从哪里开始。Maven还拥有大量常用的开源项目库。在构建过程中,Maven可以为您下载这些依赖项(以及您的依赖项:),以使构建项目的这一部分更易于管理。我认为这取决于项目的大小。。。就个人而言,我会将Maven用于需要直接编译、打包和部署的简单项目。一旦您需要做一些更复杂的事情(许多依赖项,创建映射文件…),我将切换到Ant…是一个与此非常类似的问题,它将帮助您回答问题 在官方网站上 编辑:对于

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

Maven还拥有大量常用的开源项目库。在构建过程中,Maven可以为您下载这些依赖项(以及您的依赖项:),以使构建项目的这一部分更易于管理。

我认为这取决于项目的大小。。。就个人而言,我会将Maven用于需要直接编译、打包和部署的简单项目。一旦您需要做一些更复杂的事情(许多依赖项,创建映射文件…),我将切换到Ant…

是一个与此非常类似的问题,它将帮助您回答问题

在官方网站上


编辑:对于一个新的/greenfield项目,我建议使用Maven:“约定优先于配置”将为您节省大量编写和设置构建和部署脚本的时间。使用ant时,构建脚本的长度和复杂性会随着时间的推移而增加。对于现有项目,很难将它们的配置/布局硬塞进Maven系统。

Ant主要是一个构建工具

Maven是一个项目和依赖项管理工具(当然也可以构建您的项目)


如果你想避开Maven,Ant+是一个很好的组合。

请列出更多的区别:

  • Ant没有正式的约定。您必须准确地告诉Ant在哪里找到源,在哪里放置输出,等等
  • Ant是程序性的。你必须准确地告诉蚂蚁该做什么;告诉它编译、复制、然后压缩等等
  • 蚂蚁没有生命周期
  • Maven使用约定。只要遵循这些约定,它就会自动知道源代码的位置。你不需要告诉Maven它在哪里
  • Maven是声明性的;您所要做的就是创建一个pom.xml文件,并将源代码放在默认目录中。马文会处理剩下的事情
  • Maven有一个生命周期。您只需调用mvn安装,并执行一系列顺序步骤
  • Maven对常见的项目任务很有智慧。要运行测试,只要文件位于默认位置,就可以简单地执行mvn测试。在Ant中,您首先需要知道JUnit JAR文件是什么,然后创建一个包含JUnit JAR的类路径,然后告诉Ant应该在哪里查找测试源代码,编写一个编译测试源代码的目标,最后使用JUnit执行单元测试
更新:


这是从哪里来的。很抱歉,我完全忘了引用它。

Maven既是一个依赖项管理工具,也可以用于从中央存储库或您设置的存储库检索JAR,还可以作为一个声明性构建工具。“声明式”构建工具与更传统的构建工具(如ant或make)之间的区别在于,您需要配置需要完成的内容,而不是如何完成。例如,您可以在maven脚本中说,项目应该打包为WAR文件,maven知道如何处理这个问题

Maven依赖于关于项目目录如何布局的约定,以实现其“声明性”。例如,它有一个约定,用于将主代码放在何处、将web.xml放在何处、单元测试等等,但也提供了在需要时更改它们的能力

您还应该记住,maven中有一个用于运行ant命令的插件:

此外,maven的原型使项目的启动非常快。例如,有一个Wicket原型,它提供了一个maven命令,您可以运行该命令来获得一个完整的、准备运行helloworld类型的项目

在中,我在介绍部分的标题中提到了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示例中,您可以看到如何准确地告诉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>

4.0.0
org.sonatype.mavenbook
.   您可以使用Nexus代理远程存储库,并为您的团队提供部署内部构件的场所
  • 您拥有适当的软件组件模块化。一个大的单片组件很少随时间扩展。随着项目的发展,您需要了解模块和子模块的概念。Maven非常适合这种方法
  • 您的构建采用了一些约定。即使您使用Ant,也应该努力采用与其他项目一致的某种形式的约定。当项目使用Maven时,
    <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/maven-4_0_0.xsd">
    
        <parent>
            <groupId>com.mycompany</groupId>
            <artifactId>app-parent</artifactId>
            <version>1.0</version>
        </parent>
    
        <modelVersion>4.0.0</modelVersion>
        <artifactId>persist</artifactId>
        <name>Persistence Layer</name>
    
        <dependencies>
    
            <dependency>
                <groupId>com.mycompany</groupId>
                <artifactId>common</artifactId>
                <scope>compile</scope>
                <version>${project.version}</version>
            </dependency>
    
            <dependency>
                <groupId>com.mycompany</groupId>
                <artifactId>domain</artifactId>
                <scope>provided</scope>
                <version>${project.version}</version>
            </dependency>
    
            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate</artifactId>
                <version>${hibernate.version}</version>
                <scope>provided</scope>
            </dependency>
    
            <dependency>
                <groupId>commons-lang</groupId>
                <artifactId>commons-lang</artifactId>
                <version>${commons-lang.version}</version>
                <scope>provided</scope>
            </dependency>
    
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring</artifactId>
                <version>${spring.version}</version>
                <scope>provided</scope>
            </dependency>
    
            <dependency>
                <groupId>org.dbunit</groupId>
                <artifactId>dbunit</artifactId>
                <version>2.2.3</version>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>org.testng</groupId>
                <artifactId>testng</artifactId>
                <version>${testng.version}</version>
                <scope>test</scope>
                <classifier>jdk15</classifier>
            </dependency>
    
            <dependency>
                <groupId>commons-dbcp</groupId>
                <artifactId>commons-dbcp</artifactId>
                <version>${commons-dbcp.version}</version>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>com.oracle</groupId>
                <artifactId>ojdbc</artifactId>
                <version>${oracle-jdbc.version}</version>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>org.easymock</groupId>
                <artifactId>easymock</artifactId>
                <version>${easymock.version}</version>
                <scope>test</scope>
            </dependency>
    
        </dependencies>
    
    </project>
    
    <project name="persist" >
    
        <import file="../build/common-build.xml" />
    
    
        <path id="compile.classpath.main">
            <pathelement location="${common.jar}" />
            <pathelement location="${domain.jar}" />
            <pathelement location="${hibernate.jar}" />
            <pathelement location="${commons-lang.jar}" />
            <pathelement location="${spring.jar}" />
        </path>
    
    
        <path id="compile.classpath.test">
            <pathelement location="${classes.dir.main}" />
            <pathelement location="${testng.jar}" />
            <pathelement location="${dbunit.jar}" />
            <pathelement location="${easymock.jar}" />
            <pathelement location="${commons-dbcp.jar}" />
            <pathelement location="${oracle-jdbc.jar}" />
            <path refid="compile.classpath.main" />
        </path>
    
    
        <path id="runtime.classpath.test">
            <pathelement location="${classes.dir.test}" />
            <path refid="compile.classpath.test" />
        </path>
    
    
    </project>