Java中三大构建工具的发展历程(Ant、Maven和Gradle)

embedded/2024/12/28 0:45:03/

在这里插入图片描述

🐸 背景

我们要写一个Java程序,一般的步骤是编译,测试,打包。

这个构建的过程,如果文件比较少,我们可以手动使用java, javac,jar命令去做这些事情。但当工程越来越大,文件越来越多,这个事情就不是那么地令人开心了。

因为这些命令往往都是很机械的操作。所以我们可以把这些机械的操作交给机器去做。

而在linux中,有一个工具叫make。
我们可以通过编写Makefile来执行工程的构建,在windows上相应的工具是nmake。

那既然有现成的工具,为什么当时没有选择Makefile呢?说道这里那就不得不提一下Ant了。

🍃 Ant

说起Ant,就不得不说另一个Apache开源项目Tomcat。Tomcat作为轻量级Web容器,早已声名鹊起。最开始的时候,Ant是Tomcat的一部分,Ant的唯一目的就是build Tomcat。

不久,很多Java开源项目意识到Ant的简洁适用,更重要的是弥补Makefiles的不足。自从Jakarta以及Apache项目开始采用Ant以来,作为构建工具的Ant很快发展在各种各样的项目中。

在2000年1月,Ant脱离了Tomcat,成为独立的Apache开源项目,由独立的CVS模块维护,正式更名为Apache Ant。

第一个Ant版本是Tomcat 3.1于2000年4月19日发行的版本。此版本后来称为Ant 0.3.1。

到目前Ant最新的版本是 2020年5月13日 版本号:1.10.8

具体的版本发行历程可点击链接查看 http://ant.apache.org/faq.html

🎈 Ant示例

<?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定义了五个任务,init, compile, build, test,clean。

每个任务做什么都定义清楚了。在打包之前要先编译,所以通过depends来指定依赖的路径。

如果在命令行里执行ant build,那就会先执行compile,而compile又依赖于init,所以就会先执行init。

执行命令:

ant test

通过命令就可以执行编程,打包,测试。为开发者带来了很大的便利,提供了工作效率。

但是Ant有一个很致命的缺陷,那就是没办法管理依赖。

我们一个工程,要使用很多第三方工具,不同的工具,不同的版本。

每次打包都要自己手动去把正确的版本拷到lib下面去,不用说,这个工作既枯燥还特别容易出错。为了解决这个问题,Maven如约而至。

🍂 Maven

Maven之前我们经常使用Ant来进行Java项目的构建,然后Ant仅是一个构建工具,它并未对项目的中的工程依赖以及项目本身进行管理,并且Ant作为构建工具未能消除软件构建的重复性,因为不同的项目需要编写对应的Ant任务。

Maven作为后来者,继承了Ant的项目构建功能,并且提供了依赖关系,项目管理的功能,因此它是一个项目管理和综合工具, 其核心的依赖管理, 项目信息管理, 中央仓库,约定大于配置的核心功能使得Maven成为当前Java项目构建和管理工具的标准选择。

Maven 发展历程: Maven --> Maven2 --> Maven3

到目前Maven最新的版本是 2019-11-25 版本号:3.6.3

🎈 Maven示例

<?xml version="1.0" encoding="utf-8"?>
<project ...xmlns...><groupId>net.devcheng.demo</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>

由示例得知,包的坐标是net.devcheng.demo:Example:0.1.0-SNAPSHOT,而工程中要依赖junit:junit:4.10。

那么Maven就会自动去帮我把junit打包进来。如果本地没有junit,maven还会帮自动去网上下载。我们还通过Maven安装目录下的settings.xml文件可以配置本地仓库的路径,以及采用的远程仓库的地址。

相对于上文中的Ant来说,Maven抛弃了Ant中通过target定义任务的做法,对于依赖引入了生命周期。

最后在说说 Gradle。

🌿 Gradle

Gradle是一个基于Apache Ant和ApacheMaven概念的项目自动化构建开源工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,目前也增加了基于Kotlin语言的kotlin-based DSL,抛弃了基于XML的各种繁琐配置。

由以上定义得知,Gradle已经抛弃了Ant,Maven中Xml配置的形式。Gradle继承了Maven中仓库,坐标,依赖这些核心概念。文件的布局也和Maven相同。但同时,又继承了Ant中target的概念,我们又可以重新定义自己的任务(在Gradle中叫做task)。

🎈 Gradle示例

apply plugin: 'java'repositories {jcenter()
}dependencies {compile 'org.slf4j:slf4j-api:1.7.21'your tests.testCompile 'junit:junit:4.12'
}

由示例可看出内容很简单,引入了java插件,指定仓库,指定依赖。可以看到依赖的设定相比起xml的写法,变得大大简化了。

到目前Gradle最新的版本是 2020年6月2日 版本号:v6.5

🆚 Gradle vs Maven

关于Gradle和Maven的区别,简单比较如下:

  • Maven和Gradle对依赖项的scope有所不同。
    在Maven世界中,一个依赖项有6种scope,分别是complie(默认)、provided、runtime、test、system、import。
    而grade将其简化为了4种,compile、runtime、testCompile、testRuntime。

  • Gradle支持动态的版本依赖。在版本号后面使用+号的方式可以实现动态的版本管理。

  • 解决依赖冲突方面Gradle的实现机制更加明确。使用Maven和Gradle进行依赖管理时都采用的是传递性依赖;而如果多个依赖项指向同一个依赖项的不同版本时就会引起依赖冲突。而Maven处理这种依赖关系往往是噩梦一般的存在。而Gradle在解决依赖冲突方面相对来说比较明确。

  • Maven引用依赖方面采用的xml,而Gradle不是。


The end.


http://www.ppmy.cn/embedded/149310.html

相关文章

springboot489基于springboot的七彩云南文化旅游网站的设计与实现(论文+源码)_kaic

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装七彩云南文化旅游网站软件来发挥其高效地信息处理的作用&am…

mybatis/mybatisplus

一、mybatis 1.什么是 持久化框架。通过XML或注解的方式将实体类和SQL语句进行映射&#xff0c;开发者快速进行CRUD操作。 2.核心组件 (1)SqlSessionFactory 创建SqlSession实例。用于执行SQL操作 。代码 String resource "org/mybatis/example/mybatis-config.xml&q…

Redis分片集群+MQ处理高并发

Redis的三大集群模式&#xff1a;主从复制、哨兵模式和Cluster模式。每种模式都有其特点和应用场景&#xff0c;具体如下&#xff1a; 主从复制模式&#xff1a;适用于数据备份和读写分离场景&#xff0c;配置简单&#xff0c;但在主节点故障时需要手动切换。哨兵模式&#xff…

查看mysql编译参数

cat /usr/local/mysql/bin/mysqlbug|grep configure This is set by configure CONFIGURE_LINE“./configure ‘–prefix/usr/local/mysql’ ‘–localstatedir/var/lib/mysql’ ‘–with-commentSource’ ‘–with-server-suffix-Linuxtone’ ‘–with-mysqld-usermysql’ ‘…

【ES6复习笔记】模板字符串(3)

介绍 模板字符串是 ES6 引入的一种新的字符串声明方式&#xff0c;它使用反引号&#xff08;&#xff09;来定义字符串&#xff0c;而不是单引号&#xff08;&#xff09;或双引号&#xff08;"&#xff09;。模板字符串可以包含变量、表达式和换行符&#xff0c;这使得它…

FileLink为企业打造了一站式的跨网安全文件共享解决方案

在现代企业信息化建设中&#xff0c;内外网隔离已成为保障网络安全的重要手段。然而&#xff0c;这种隔离也带来了文件共享的诸多难题。如何在确保安全的前提下&#xff0c;实现高效、便捷的文件流通&#xff1f;FileLink 内外网文件共享平台应运而生&#xff0c;为企业打造了一…

AI多模态技术介绍:理解多模态大语言模型的原理

本文目标是解释多模态LLMs的工作原理&#xff0c;虽然多模态的输入可以有音频&#xff0c;文本&#xff0c;图像和视频&#xff0c;但这里主要讨论的还是以图文为主的多模态大语言模型。 参考文章&#xff1a;https://magazine.sebastianraschka.com/p/understanding-multimoda…

使用linux 命令上传文件到百度网盘

使用linux 命令上传文件到百度网盘 文章目录 使用linux 命令上传文件到百度网盘说明一&#xff0c;准备工作二&#xff0c;下载文件三&#xff0c; 上传文件四&#xff0c;查看百度网盘bypy下的内容五&#xff0c;退出登陆 说明 在我们日常部署的时候需要将linux上的安装包上传…