美文网首页android开发技巧
java 构建工具Ant、Maven和Gradle

java 构建工具Ant、Maven和Gradle

作者: 大鹏的鹏 | 来源:发表于2019-04-26 16:18 被阅读0次

    一.什么是构建工具.

    在进行编程操作的时候,我们经常会遇到很多与编程无关的项目管理工作。如下载依赖、编译源码、单元测试、项目部署等操作。一般的,小型项目我们可以手动实现这些操作,然而大型项目这些工作则相对复杂。所以我们需要用到构建工具。构建工具是帮助我们实现一系列项目管理、测试和部署操作的工具。构建工具可以把源代码生成可执行应用程序的过程自动化的程序(例如Android app生成apk)。构建工具包括编译、连接跟把代码打包成可用的或可执行的形式。

    总的来说构建的自动化是编写或使一大部分任务自动执行的一个动作,而这些任务则是软件开发者的日常,像是:

    • 下载依赖。
    • 将源代码编译成二进制代码。
    • 打包生成的二进制代码。
    • 进行单元测试。
    • 部署到生产系统。

    二.为什么要使用构建工具.

    比如我们要写一个Java程序,一般的步骤也就是编译,测试,打包。这个构建的过程,如果文件比较少,我们可以手动使用java, javac, jar命令去做这些事情。但当工程越来越大,文件越来越多,这个事情就不是那么地令人开心了。因为这些命令往往都是很机械的操作。但是我们可以把机械的东西交给机器去做。
    Java世界中主要有三大构建工具:Ant、Maven和Gradle。

    三.java平台常用的构建工具之Ant.

    Ant 是由 Java 编写的构建工具,它的核心代码是由Java编写的,因此具有平台无关性,构建脚本是XML格式的(默认为bulid.xml)。
    例如:下面列出一个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的构建脚本还是比较清楚的。ant定义了五个任务,init, compile, build, test, clean。每个任务做什么都定义清楚了。打包之前要先编译,所以通过depends来指定依赖的路径。如果在命令行里执行ant build,那就会先执行compile,而compile又依赖于init,所以就会先执行init。有了这个东西以后,我们只要一条命令:

    ant test
    

    就可以执行编程,打包,测试了。为开发者带来了很大的便利。
    但是ant有一个很致命的缺陷,那就是没办法管理依赖。我们一个工程,要使用很多第三方工具,不同的工具,不同的版本。每次打包都要自己手动去把正确的版本拷到lib下面去,这个工作既枯燥还特别容易出错。为了解决这个问题,maven登场了。

    四.java平台常用的构建工具之maven.

    Maven作为后来者, 继承了Ant的项目构建功能, 同样采用了XML作为构建脚本的格式。Maven具有依赖管理和项目管理的功能,提供了中央仓库,能帮助我们自动下载库文件。maven最核心的改进就在于提出仓库这个概念。我可以把所有依赖的包,都放到仓库里去,在我的工程管理文件里,标明我需要什么什么包,什么什么版本。在构建的时候,maven就自动帮我把这些包打到我的包里来了。我们再也不用操心着自己去管理几十上百个jar文件了。

    这了达到这个目标,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定义任务的做法,而是引入了生命周期的概念。
    maven的缺点有:

    • maven是使用xml进行配置的,语法不简洁。
    • maven在约定优于配置这条路上走太远了。就是说,maven不鼓励你自己定义任务,它要求用户在maven的生命周期中使用插件的方式去工作。这有点像设计模式中的模板方法模式。说通俗一点,就是我使用maven的话,想灵活地定义自己的任务是不行的

    三.java平台常用的构建工具之Gradle.

    gradle充分地使用了maven的现有资源。继承了maven中仓库,坐标,依赖这些核心概念。文件的布局也和maven相同。但同时,它又继承了ant中target的概念,我们又可以重新定义自己的任务了。
    Gradle不用XML,它使用基于Groovy的专门的DSL或者或Kotlin DSL,从而使Gradle构建脚本变得比用Ant和Maven写的要简洁清晰。Gradle样板文件的代码很少,这是因为它的DSL被设计用于解决特定的问题:贯穿软件的生命周期,从编译,到静态检查,到测试,直到打包和部署。Google采用Gradle作为Android OS的默认构建工具。

    // Apply the java plugin to add support for Java
    apply plugin: 'java'
    
    // In this section you declare where to find the dependencies of your project
    repositories {
        // Use 'jcenter' for resolving your dependencies.
        // You can declare any Maven/Ivy/file repository here.
        jcenter()
    }
    
    // In this section you declare the dependencies for your production and test code
    dependencies {
        // The production code uses the SLF4J logging API at compile time
        compile 'org.slf4j:slf4j-api:1.7.21'
    
        // Declare the dependency for your favourite test framework you want to use in your tests.
        // TestNG is also supported by the Gradle Test task. Just change the 
        // testCompile dependency to testCompile 'org.testng:testng:6.8.1' and add 
        // 'test.useTestNG()' to your build script.
        testCompile 'junit:junit:4.12'
    }
    

    参考资料:
    构建工具的进化:ant, maven, gradle

    相关文章

      网友评论

        本文标题:java 构建工具Ant、Maven和Gradle

        本文链接:https://www.haomeiwen.com/subject/khrqnqtx.html