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

news2024/12/29 10:45:01

在这里插入图片描述

🐸 背景

我们要写一个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.coloradmin.cn/o/2267409.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Wend看源码-Java-Map学习

摘要 在当今的编程世界中&#xff0c;深入了解各类数据类型对于开发者而言至关重要。本篇聚焦于 JDK 21 版本下&#xff0c;Java.util 包所提供的 Map 类型。Map 作为一种关键的数据结构&#xff0c;能够以键值对的形式高效存储和检索数据&#xff0c;广泛应用于众多领域。 本文…

uniapp开发微信小程序实现获取“我的位置”

1. 创建GetLocation项目 使用HBuilder X创建一个项目GetLocation,使用Vue3。 2. 在腾讯地图开放平台中创建应用 要获取位置,在小程序中需要使用腾讯地图或是高德地图。下面以腾讯地图为例。 (1)打开腾讯地图开放平台官方网址:腾讯位置服务 - 立足生态,连接未来 (2)注册…

如何使用 Firewalld 设置 Linux 防火墙

简介 在 Linux 中&#xff0c;防火墙是一个应用程序或服务&#xff0c;它使用预定的规则集来过滤或控制进出 Linux 服务器的网络流量。通常将防火墙配置为允许所需的流量通过&#xff0c;同时阻止其余的外部流量。 Firewalld 是一个用于 Linux 系统的防火墙管理解决方案。它是…

财务域——业财一体设计

摘要 本文讨论了业财一体化的概念、背景、目标、技术推动因素以及企业经营环境的复杂化。业财一体化旨在通过信息化手段实现业务与财务数据的实时共享与联动&#xff0c;提升管理效率和决策能力。文章还概述了业财一体化在销售管理、成本核算、预算管理和风险管控等方面的应用…

【时间之外】IT人求职和创业应知【80】-特殊日子

目录 北京冬季招聘会 OpenAI CEO炮轰马斯克 英伟达推出全新AI芯片B300 莫欢喜&#xff0c;总成空。本周必须要谨行慎言。 感谢所有打开这个页面的朋友。人生不如意&#xff0c;开越野车去撒野&#xff0c;会害了自己&#xff0c;不如提升自己。提升自己的捷径就是学习和思考…

【AIGC-ChatGPT副业提示词指令 - 动图】魔法咖啡馆:一个融合创意与治愈的互动体验设计

引言 在当今快节奏的生活中&#xff0c;咖啡早已不仅仅是提神醒脑的饮品&#xff0c;更成为了一种情感寄托和生活态度的表达。本文将介绍一个独特的"魔法咖啡馆"互动体验设计&#xff0c;通过将咖啡与情感、魔法元素相结合&#xff0c;创造出一个充满想象力和治愈感…

Docker使用——国内Docker的安装办法

文章目录 参考资料前言Mac安装办法Homebrew 安装1. 直接下报错2. 安装homebrew&#xff0c; 用国内镜像3. 安装Docker4. 启动docker服务5. 测试是否安装成功 参考资料 鸣谢大佬文章。 macOS系统中&#xff1a;Docker的安装&#xff1a;https://blog.csdn.net/sulia1234567890…

python opencv的sift特征检测(Scale-Invariant Feature Transform)

sift 官方文档地址&#xff1a;https://docs.opencv.org/4.10.0/da/df5/tutorial_py_sift_intro.html 创建SIFT实例cv2.SIFT.create()特征检测sift.detect描述子sift.compute/sift.detectAndCompute画特征cv2.drawKeypoints 原图 特征点 代码 import cv2first ./12.pngsif…

精读DeepSeek v3技术文档的心得感悟

最近宋大宝同学读完了DeepSeekv3的文档&#xff0c;心中颇多感慨&#xff0c;忍不住想在这里记录一下对这款“业界有望启示未来低精度训练走向”的开源大模型的观察与思考。DeepSeek v3的亮点绝不仅仅是“Float8”或“超长上下文”这么简单&#xff0c;而是贯穿了从数值精度、注…

yarn install 安装报错:Workspaces can only be enabled in private projects.

在本地运行项目的时候&#xff0c;使用yarn install 安装模块依赖的时候&#xff0c;遇到报错&#xff1a;Workspaces can only be enabled in private projects. 一、原因分析 报这个错误是因为你使用了yarn的workspace&#xff0c;但并未将工程标记为private。 二、解决办法 …

深度学习中的残差网络、加权残差连接(WRC)与跨阶段部分连接(CSP)详解

随着深度学习技术的不断发展&#xff0c;神经网络架构变得越来越复杂&#xff0c;而这些复杂网络在训练时常常遇到梯度消失、梯度爆炸以及计算效率低等问题。为了克服这些问题&#xff0c;研究者们提出了多种网络架构&#xff0c;包括 残差网络&#xff08;ResNet&#xff09;、…

Excel将混乱的多行做成1列

目标是将数据按从左到右&#xff0c;再从上到下排成一列。 公式法 首先用textjoin函数将文本包起来&#xff0c;做成一个超长文本。 然后用公式 截取文本 Mid(m1,n,3)&#xff0c;意思就是对m1单元格&#xff0c;从第n个字符开始&#xff0c;截取3个字符出来。 这个公式如何自…

在vscode的ESP-IDF中使用自定义组件

以hello-world为例&#xff0c;演示步骤和注意事项 1、新建ESP-IDF项目 选择模板 从hello-world模板创建 2、打开项目 3、编译结果没错 正在执行任务: /home/azhu/.espressif/python_env/idf5.1_py3.10_env/bin/python /home/azhu/esp/v5.1/esp-idf/tools/idf_size.py /home…

基于springboot校园招聘系统源码和论文

可做计算机毕业设计JAVA、PHP、爬虫、APP、小程序、C#、C、python、数据可视化、大数据、文案 使用旧方法对校园招聘系统的信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在校园招聘系统的管理上面可以解决许多信息管理上面的难题&#xff0c;比…

PaddleOCR文字识别模型的FineTune

一、paddleOCR paddle框架为百度开发的深度学习框架&#xff0c;其中对于文字检测、识别具有较为便利的开发条件。同时PaddleOCR文字识别工具较为轻量化&#xff0c;并可按照任务需求进行model的finetune&#xff0c;满足实际的业务需求。 源码来源&#xff1a;githubOCR 在gi…

【数据库初阶】Ubuntu 环境安装 MySQL

&#x1f389;博主首页&#xff1a; 有趣的中国人 &#x1f389;专栏首页&#xff1a; 数据库初阶 &#x1f389;其它专栏&#xff1a; C初阶 | C进阶 | 初阶数据结构 小伙伴们大家好&#xff0c;本片文章将会讲解 Ubuntu 系统安装 MySQL 的相关内容。 如果看到最后您觉得这篇…

MoH:将多头注意力(Multi-Head Attention)作为头注意力混合(Mixture-of-Head Attention)

摘要 https://arxiv.org/pdf/2410.11842? 在本文中&#xff0c;我们对Transformer模型的核心——多头注意力机制进行了升级&#xff0c;旨在提高效率的同时保持或超越先前的准确度水平。我们表明&#xff0c;多头注意力可以表示为求和形式。鉴于并非所有注意力头都具有同等重…

AI助力古诗视频制作全流程化教程

AI助力古诗视频制作全流程化教程 目录 1. 制作视频的原材料&#xff08;全自动&#xff09; 2.文生图&#xff1a;图像生成&#xff08;手动&#xff09; 3.文生音频&#xff1a;TTS技术&#xff08;全自动&#xff09; 4.视频编辑&#xff08;手动&#xff09; 5.自动发…

基于SSM的“快递管理系统”的设计与实现(源码+数据库+文档+PPT)

基于SSM的“快递管理系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SSM 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 登陆页面 注册页面 快递员页面 派单员订单管理页面 派单员订单添…

AWTK 在全志 tina linux 上支持 2D 图形加速

全志 tina linux 2D 图形加速插件。 开发环境为 全志 Tina Linux 虚拟机。 1. 准备 下载 awtk git clone https://github.com/zlgopen/awtk.git下载 awtk-linux-fb git clone https://github.com/zlgopen/awtk-linux-fb.git下载 awtk-tina-g2d git clone https://github.co…