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

在这里插入图片描述

🐸 背景

我们要写一个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.rhkb.cn/news/497800.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu快速入门

1.进入某个文件夹 cd workspace/2.tab自动补全 3.列出当前文件夹所有文件 ls列出所有文件包括隐藏文件 ls -a 4.创建文件夹 mkdir linuxLearn 5.创建文件 gedit command.sh在commmand.sh键入 echo hello echo hi? echo how are you? PS:touch hello.txt(也可以创建新…

meshy的文本到3d的使用

Meshy官方网站&#xff1a; 中文官网&#xff1a; Meshy官网中文站 ​编辑 Opens in a new window ​编辑www.meshycn.com Meshy AI 中文官网首页 英文官网&#xff1a; Meshy目前似乎还没有单独的英文官网&#xff0c;但您可以在中文官网上找到英文界面或相关英文资料。 链…

嵌入式入门Day34

网络编程 Day1 为什么要学习网络编程&#xff1f;网络发展历史APRAnet阶段TCP/IP两个协议阶段网络体系结构及OSI开放系统系统互联模型网络体系结构概念OSI开放系统互联模型 TCP和UDP异同网络基础相关的概念字节序IP地址的转换IP地址子网掩码端口号 为什么要学习网络编程&#x…

代码解析:安卓VHAL的AIDL参考实现

以下内容基于安卓14的VHAL代码。 总体架构 参考实现采用双层架构。上层是 DefaultVehicleHal&#xff0c;实现了 VHAL AIDL 接口&#xff0c;并提供适用于所有硬件设备的通用 VHAL 逻辑。下层是 FakeVehicleHardware&#xff0c;实现了 IVehicleHardware 接口。此类可模拟与实…

【视觉惯性SLAM:四、相机成像模型】

相机成像模型介绍 相机成像模型是计算机视觉和图像处理中的核心内容&#xff0c;它描述了真实三维世界如何通过相机映射到二维图像平面。相机成像模型通常包括针孔相机的基本成像原理、数学模型&#xff0c;以及在实际应用中如何处理相机的各种畸变现象。 一、针孔相机成像原…

【前端,TypeScript】TypeScript速成(二):逻辑控制与循环

TypeScript 当中的逻辑控制 if-else if-else 的使用和其它语言非常相似&#xff1a; let answer: yes|no|maybe|undefined undefinedlet httpStatus: 200 | 404 | 500 | 200 | 404 | 500 200function processHttpStatus(s: 200 | 404 | 500 | 200 | 404 | 500) {// 一律使…

JSON 系列之1:将 JSON 数据存储在 Oracle 数据库中

本文为Oracle数据库JSON学习系列的第一篇&#xff0c;讲述如何将JSON文档存储到数据库中&#xff0c;包括了版本为19c和23ai的情形。 19c中的JSON 先来看一下数据库版本为19c时的情形。 创建表colortab&#xff0c;其中color列的长度设为4000。若color的长度需要设为32767&a…

TOGAF之架构标准规范-业务架构

TOGAF标准规范中&#xff0c;业务架构阶段的主要工作是开发支持架构愿景的业务架构。 如上所示&#xff0c;业务架构&#xff08;Business Architecture&#xff09;在TOGAF标准规范中处于B阶段&#xff0c;该阶段的主要内容包括阶段目标、阶段输入、流程步骤、架构方法。 阶段…

科技创新 数智未来|清科·沙丘投研院走进竹云

12月20日&#xff0c;清科沙丘投研院带领企投家团队走进竹云交流分享&#xff0c;聚焦技术创新、企业数字化管理、行业前沿应用案例等热点议题&#xff0c;深入探讨数字技术如何点燃企业高质量发展的澎湃动力&#xff0c;共话企业数字化、智能化发展之道。 达晨财智股权管理部…

【免费分享】mysql笔记,涵盖查询、缓存、存储过程、索引,优化。

概括 本篇笔记涵盖基础查询、视图、存储过程、函数、索引、优化、分库分表。适合在学完mysql后进行时常观看。下面展示部分内容。如果需要可以在文章底部的链接进行下载查看。 简介 数据库 数据库&#xff1a;DataBase&#xff0c;简称 DB&#xff0c;存储和管理数据的仓库…

Docker 安装全攻略:从入门到上手

Docker 安装全攻略&#xff1a;从入门到上手 在当今的软件开发与部署领域&#xff0c;Docker 已经成为了一项不可或缺的关键技术。它能够将应用程序及其依赖项打包成轻量级、可移植的容器&#xff0c;极大地简化了开发、测试和部署的流程。本文将详细讲解在不同操作系统下 Doc…

mysql建立主从集群

mysql建立主从集群需要多个mysql服务器&#xff0c;主从数据库是通过log日志来进行同步的&#xff0c;所以需开启log-bin。本地安装多个mysql参考底部 主数据库配置 打开主数据库my.ini配置文件&#xff0c;给其配置server_id1 [mysqld] port3306 basedirD:/phpstudy_pro/1/…

curl+openssl 踩坑笔记

curl编译&#xff1a;点击跳转 踩坑一 * SSL certificate problem: unable to get local issuer certificate * closing connection #0 curl: (60) SSL certificate problem: unable to get local issuer certificate More details here: https://curl.se/docs/sslcerts.html …

【开源免费】基于SpringBoot+Vue.JS租房管理系统(JAVA毕业设计)

本文项目编号 T 102 &#xff0c;文末自助获取源码 \color{red}{T102&#xff0c;文末自助获取源码} T102&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

小程序配置文件 —— 13 全局配置 - window配置

全局配置 - window配置 这里讲解根目录 app.json 中的 window 字段&#xff0c;window 字段用于设置小程序的状态栏、导航条、标题、窗口背景色&#xff1b; 状态栏&#xff1a;顶部位置&#xff0c;有网络信号、时间信息、电池信息等&#xff1b;导航条&#xff1a;有一个当…

BLE core 内容整理解释

本文内容比较杂散&#xff0c;只是做记录使用&#xff0c;后续会整理的有条理些 link layer 基本介绍 **Link Layer Control&#xff08;链路层控制&#xff09;**是蓝牙低功耗&#xff08;BLE&#xff09;协议栈的核心部分&#xff0c;负责实现设备间可靠、安全、低功耗的数…

【目标跟踪+人流计数+人流热图(Web界面)】基于YOLOV11+Vue+SpringBoot+Flask+MySQL

前言 本系统是基于YOLOv11SpringBootVueFlaskMySQL的人流计数、人流热图系统&#xff08;包含YOLO全系列&#xff09; 系统可以上传视频选择yolo模型进行人流计数。还支持自主划定检测区域&#xff0c;行人轨迹追踪、查看计数结果等功能。 可支持人流计数、人流热图以及人流热…

vuex - 第一天

思维逻辑 解决问题 代码能力2 vue2的项目 北京前端鸿蒙6期 语雀 vuex 在组件中使用 插件支持v2和v3 宏任务 和 微任务 多问问自己为什么 new的四步

什么是网络安全(Cybersecurity)?

不同组织机构对网络安全&#xff08;Cybersecurity或Cyber Security&#xff09;的定义不尽相同。从目标上来说&#xff0c;网络安全主要用于保护网络、计算机、移动设备、应用程序及数据等资产免受网络攻击&#xff0c;避免造成数据泄露、业务中断等安全问题。 网络钓鱼、勒索…

Selenium+Java(21):Jenkins发送邮件报错Not sent to the following valid addresses解决方案

问题现象 小月妹妹近期在做RobotFrameWork自动化测试,并且使用Jenkins发送测试邮件的时候,发现报错Not sent to the following valid addresses,明明各个配置项看起来都没有问题,但是一到邮件发送环节,就是发送不出去,而且还不提示太多有用的信息,急的妹妹脸都红了,于…