maven 父maven_Maven神秘化

maven 父maven

由于我的Android开发的背景下,我比较习惯到Gradle ,而不是Maven的 。 尽管我知道Gradle基于Maven,但我从未调查过幕后发生的事情。 在过去的一周中,我一直在尝试了解细节并找出Maven的不同组成部分。

什么是Maven

Maven是主要用于Java项目的构建和依赖关系管理系统。

主要功能包括:

  • 通过原型创建新项目。
  • POM文件和设置文件中的项目配置
  • 使用生命周期 , 阶段 , 插件 , 目标和构建配置文件进行项目构建 。
  • 通过存储库进行依赖管理
  • 使用发布插件进行部署。

项目对象模型

项目对象模型或POM是Maven中的基本工作单元。 这是一个XML文件,通常在项目根目录中定义,其中包含有关项目的信息以及Maven用于构建项目的配置

可以包含在POM文件中的配置如下:

  • 插件和目标
  • 依存关系
  • 储存库
  • 构建配置文件
  • 项目元数据,例如版本,描述,开发人员等。

为了简化所有项目的默认配置,Maven提供了所谓的Super POM 。 超级POM是Maven的默认POM。 所有POM都扩展了Super Pom,从而继承了Super POM中指定的配置。

设置文件

如上所述,POM文件包含项目配置,而Settings文件包含用户特定的配置。 可以有两个设置文件,位于Maven安装目录中的全局设置文件和位于用户主目录中的用户设置文件。

设置文件可以提供以下配置:

  • 简单的价值观
  • 插件组
  • 服务器凭证
  • 代理人
  • 个人资料

建立生命周期

Maven构建过程基于生命周期 。 生命周期为构建和分发项目工件提供了明确定义的过程。

Maven中有三个不同的生命周期。

  • 默认值:处理项目的构建和部署。
  • 清洁:处理项目清洁。
  • 网站:处理项目的网站文档。

相数

每个生命周期由一系列称为build phases的阶段定义。 构建阶段负责生命周期中的特定步骤,但是其执行职责的方式取决于绑定到该阶段的插件目标。

外挂程式

插件是为构建阶段提供目标的构件。 插件将阶段划分为目标,使构建过程真正灵活且可定制。

插件可以提供一个或多个目标。 每个目标都代表该插件的功能。

例如,Maven仅支持项目的单个源和测试目录。 如果我们决定向项目添加其他目录,则可以使用提供目标的插件,以将源目录和测试目录添加到构建过程中。

目标

目标负责在每个阶段执行特定任务。

有些阶段具有默认目标。 对于默认生命周期,默认选项由在项目的POM文件中定义的包装选项提供。

除了默认目标外,还可以通过在项目的POM文件中配置插件来定义其他目标。 因此,一个特定的构建阶段可以由多个目标组成。 如果一个阶段没有任何目标,则不会将其作为生命周期的一部分执行。

行家生命周期

独立插件

大多数插件都提供了绑定到构建阶段的目标。 但是,有些插件提供的目标应单独执行,而不是作为构建生命周期的一部分。

原型插件

如果您恰好是IntelliJ用户,则可能已经看到,在创建新的Maven项目时,第一个选项是原型列表。 您是否想知道它的用途是什么? 我不得不说,直到我通过挖掘Maven功能找到了原型之后,我才开始。

原型只是现有的项目模板。 Archetype插件提供了Maven项目模板。 它基于标准模板创建项目结构和POM文件。 通过仅提供项目特定的配置(例如groupid,工件名称等),以交互方式完成创建新项目的过程。

它有助于应用项目或组织的最佳实践。 新用户可以在几秒钟内拥有一个可以用作步行骨架的工作项目。

该插件具有附加支持,这意味着可以用于向现有项目中添加片段,即Maven站点原型可以快速创建该项目的文档站点。

用户可以在组织的存储库中创建自己的原型,并将其用作新项目的基础。

作为独立的插件,原型插件提供了不受任何生命周期约束的目标。 目标是直接执行的,与使用生命周期时执行的操作相反,在生命周期中,目标是生命周期阶段的一部分。

发布插件

提供发布项目工件的标准机制。

Release插件有两个主要目标。

准备

  1. 确认没有未提交的更改。
  2. 提示用户提供标签,发行和开发版本名称。
  3. 修改并提交POM文件中的发布信息。
  4. 标记整个项目。

执行

  1. 以新标签名称提取文件修订
  2. 在提取的项目实例上执行Maven生命周期
  3. 将工件部署到本地和远程存储库

储存库

Maven使用存储库来保存构建工件和依赖项。

Maven 存储库与Git中一样使用,但是存储构建和依赖项目而不是源代码。 这样做,用户可以轻松地从存储库中消耗您的项目工件。

localremote存储库有两种类型,两者的存储结构相同。 本地存储库位于用户的本地计算机中,并用作远程存储库的缓存,提供了脱机构建功能。 远程存储库可以分为两个子组,即publicinternal 。 公共存储库拥有可公开获取的工件,而内部存储库是在组织中创建的,以在开发团队之间共享内部工件。

强烈建议使用Maven时,依赖项JAR不应存储在源代码管理中,而是存储在存储库中。 这样做,Maven能够处理传递依赖关系,因为所有依赖关系信息都可以通过POM文件和Maven存储库获得。

构建配置文件

Maven 构建配置文件用于促进可移植构建。 构建配置文件会在构建时修改POM文件,以提供与环境有关的等效但有区别的参数。 例如,这是定义每个用户不同的文件系统引用的理想场所。

概要文件提供了可以在POM文件中引用的属性。 这些属性在配置文件声明的<properties>部分中定义。

可以在POM文件中,根据每个项目定义或在Settings文件中声明构建配置文件。 全局设置文件中定义的构建配置文件可用于机器的所有用户,而用户设置文件中定义的配置文件仅可用于特定用户。

配置文件以不同的方式触发:

  • 明确地:通过命令行(包括-P选项)运行Maven构建。
  • Maven设置:在<active profiles>部分中包含配置<active profiles> 。 使用此选项时,配置文件始终处于活动状态。
  • 配置文件声明中的<activation>部分:激活部分可以根据环境变量,操作系统设置以及丢失或存在的文件来激活某个配置文件。

结论

Maven可以在许多方面减轻开发工作的负担:

  • 轻松构建过程
  • 统一构建系统
  • 丰富的项目信息
  • 最佳发展准则
  • 透明迁移到新功能

我意识到直到最近我才知道有多少Maven功能,因此我邀请您自己检查它们。 你不会失望的。

翻译自: https://www.javacodegeeks.com/2016/08/maven-demystified.html

maven 父maven

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/335833.shtml

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

相关文章

【WebRTC---序篇】(一)为什么要使用WebRTC

1.1.1自研直播客户端架构 一个最简单的直播客户端至少应该包括音视频采集模块,音视频编码模块,网络传输模块,音视频解码模块和音视频渲染模块五大部分。如下图所示 1.1.2拆分音视频模块 在实际开发中,音频和视频处理完全是独立的。如下图所示,经过细分后,音频采集与视频…

DFS深搜与BFS广搜专题

一般搜索算法的流程框架 DFS和BFS与一般搜索流程的关系 如果一般搜索算法流程4使用的是stack栈结构(先进后出&#xff0c;后进先出)那么就会越搜越深。即&#xff0c;DFS&#xff0c;DFS只保存当前一条路径&#xff0c;其目的是枚举出所有可能性。反之&#xff0c;如果流程4使…

cloud foundry_使用“另类” Cloud Foundry Gradle插件无需停机

cloud foundry我一直在尝试编写用于将应用程序部署到Cloud Foundry的gradle插件 &#xff0c;并在上一篇文章中写了有关此插件的文章 。 现在&#xff0c;我通过使用两种方法支持将无停机时间部署到Cloud Foundry中来增强此插件&#xff1a; 自动驾驶风格部署和更常用的蓝绿色风…

懒惰学习_懒惰评估

懒惰学习最近&#xff0c;我正在编写log4j附加程序&#xff0c;并希望在自定义附加程序创建过程中使用logger记录一些诊断详细信息&#xff0c;但是log4j初始化仅在创建附加程序实例后才完成&#xff0c;因此在此阶段记录的消息将被忽略。 我感到需要在自定义附加程序中进行延…

leetcode(动态规划专题)

线性DP 53. 最大子数组和 思路 code int maxSubArray(vector<int>& nums) {//res:最后所有状态的最终Max结果//lat:当前f[i]状态的Maxint res INT_MIN, last 0;for (int i 0; i < nums.size(); i){//当前f[i]状态最大值(使用下面的状态转移方程得出)//f[i] …

leetcode(链表专题)

数组模拟链表 #include<iostream> using namespace std;const int N 100; // 单链表 // head存储链表头&#xff0c;e[]存储节点的值&#xff0c;ne[]存储节点的next指针&#xff0c;idx表示当前用到了哪个节点 int head, e[N], ne[N], idx;// 初始化 void init() {hea…

lagom cqrs_Java和Lagom的CQRS

lagom cqrs我很高兴在Chicago Java User Group上进行了讨论&#xff0c;并讨论了Lagom如何实现CQRS&#xff08;命令查询责任隔离模式&#xff09;。 值得庆幸的是&#xff0c;有一个录音&#xff0c;我还把这些幻灯片发布在slideshare上 。 抽象&#xff1a; 一旦应用程序变…

【WebRTC---源码篇】(四)WebRTC线程模型

常见的线程模型 1.为了解决频繁线程创建与销毁,在此模型中使用的线程池。在线程池创建的时候就将一些线程创建起来,以提高效率。通过控制线程数量来解决线程频繁切换。 2.一般线程与线程存在前后关系的,线程执行完毕之后生成一个新的任务(task1 , task2,task3---)插入到任…

java cuba_CUBA平台–用于快速应用程序开发的开源Java框架

java cuba传统上&#xff0c;自计算时代开始以来&#xff0c;企业软件开发自然面临着一个挑战&#xff0c;当时自然而然地&#xff0c;企业软件开发本应专注于解决实际的业务问题&#xff0c;但与此同时&#xff0c;开发人员必须在技术上花费大量时间和精力。解决方案的一面&am…

java中什么时候应用异常_生产Java应用程序中的十大异常类型-基于1B事件

java中什么时候应用异常Pareto记录原理&#xff1a;97&#xff05;的记录错误语句是由3&#xff05;的唯一错误引起的 在最新的数据整理帖子之后&#xff0c;我们收到了很多反馈和问题&#xff0c;我们发现97&#xff05;的记录错误是由10个唯一错误引起的 。 根据大众的需求&…

C++ 11 深度学习(十四)C++类

(一)综述&#xff1a;类是我们自己定义的数据类型 设计时要考虑的角度&#xff1a; 站在设计和实现的角度来考虑&#xff1b;站在使用者的角度考虑&#xff1b;父类&#xff0c;子类之间的考虑&#xff1b; &#xff08;二&#xff09;explicit 首先, C中的explicit关键字只…

手动编译 lombok_Lombok,一种编译时Java注释预处理器,可最大程度地减少代码大小...

手动编译 lombok在本文中&#xff0c;我们将看到如何在常规Java代码中使用lombok来最大程度地减少代码长度和冗余。 什么是Lombok&#xff1f; Lombok&#xff0c;一个编译时注释预处理器&#xff0c;有助于在编译时注入一些代码。 在详细介绍之前&#xff0c;我要求您应该从…

mysql超大表处理方式是_第29问:MySQL 的复制心跳说它不想跳了

问题最近年底&#xff0c;大家的数据库经常跑批量大事务&#xff0c;会发现复制突然断开&#xff0c;报错“心跳与本地信息不兼容”&#xff1a;会是什么原因&#xff1f;实验我们先来复现一下&#xff0c;再进行分析。宽油&#xff0c;做一对主从数据库&#xff1a;我们先造一…

sap 分摊分配不产生会计凭证的原因_SAP软件的物料分类账功能

物料账介绍物料分类账(Material Ledger)是SAP财务模块的重要功能之一&#xff0c;用于对标准价计价的物料进行差异处理。激活ML后&#xff0c;系统会在"工厂物料"层(或更细的层次)为每个物料建立子账簿&#xff0c;记录该物料在各个期间的数量、价值变化情况。月底运…

忽略异常_忽略已检查的异常,所有出色的开发人员都在这样做–基于600,000个Java项目...

忽略异常Github和Sourceforge上超过600,000个Java项目中的异常处理概述 Java是使用检查异常的少数几种语言之一。 它们在编译时强制执行&#xff0c;并且需要某种处理。 但是……在实践中会发生什么&#xff1f; 大多数开发人员实际上会处理任何事情吗&#xff1f; 他们怎么做…

数据结构【队列专题】

先进先出&#xff08;First In First Out&#xff0c;FIFO&#xff09;的线性序列&#xff0c;成为“队列”。 队列也是一种线性表&#xff0c;只不过它是操作受限的线性表&#xff0c;只能在两端操作&#xff1a; 一端进&#xff0c;一端出。进的一端成为队尾&#xff08;re…

oracle安装卡在create inventory_滴滴云服务器上安装Oracle12cR2单实例数据库

一、相关说明Oracle数据库是由美国甲骨文公司推出的一款优秀的关系型数据库。当前最新版为Database 19c。本文简述Oracle Database 12cR2在滴滴云主机上的安装过程。如需更权威的指导方法请参考Oracle官方安装文档。二、环境概述一台DC2云主机&#xff08;2c4g&#xff09;一个…

【WebRTC---序篇】(二)Windows平台WebRTC源码编译

需要准备的东西 (一)一个强大的梯子(懂得都懂)!!!!!!!!! (二) 下载depot_tools Windows指定地址必须在此下载 打开这个页面,找 install depot_tools 这个关键字 请把他解压到C盘,并且设置到PATH环境变量种,且让它处于最顶端。 其他需要设置的额外变量 DEPOT_TOOLS_…

商品管理后台发布商品时,规格值组合的前端交互的实现逻辑

方案1&#xff1a;先计算总行数&#xff0c;再循环填充规格值 根据每种规格值数量计算得到总行数&#xff0c;如果下图有3种规格&#xff1a;长度、重量、大小&#xff0c;规格值个数分别为&#xff1a;3、3、2,3x3x218行。 规格种类有3种&#xff0c;于是写3层嵌套递归循环填…

【WebRTC---源码篇】(五)WebRTC视频引擎

1. 视频数据的采集时间 2.视频分发器VideoBroadCaster