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拆分音视频模块 在实际开发中,音频和视频处理完全是独立的。如下图所示,经过细分后,音频采集与视频…

python实现lenet_吴裕雄 python 神经网络TensorFlow实现LeNet模型处理手写数字识别MNIST数据集...

importtensorflow as tftf.reset_default_graph()#配置神经网络的参数INPUT_NODE 784OUTPUT_NODE 10IMAGE_SIZE 28NUM_CHANNELS 1NUM_LABELS 10#第一层卷积层的尺寸和深度CONV1_DEEP 32CONV1_SIZE 5#第二层卷积层的尺寸和深度CONV2_DEEP 64CONV2_SIZE 5#全连接层的节点个数F…

DFS(深度搜索最简单的应用)

全排列数字 #include<iostream>using namespace std;const int N 10;int n 3; //最终输出 int path[N]; //记录当前使用过的数 int st[N];void dfs(int u) {if (u n){for (int i 0; i < n; i)printf("%d ", path[i]);puts("");return;}for (…

lucene学习笔记_学习Lucene

lucene学习笔记我目前正在与一个团队合作&#xff0c;开始一个基于Lucene的新项目。 虽然大多数时候我会争论使用Solr还是Elasticsearch而不是简单的Lucene&#xff0c;但这是一个有意识的决定。 在这篇文章中&#xff0c;我正在整理一些学习Lucene的资源–希望您对他们有所帮助…

websocket没准备好如何解决_那些很重要,但是不常用的技术,websocket

目录1. 为什么会有websocket2. websocket协议格式3. 协议具体实现一、为什么需要 WebSocket&#xff1f;初次接触 WebSocket 的人&#xff0c;都会问同样的问题&#xff1a;我们已经有了 HTTP 协议&#xff0c;为什么还需要另一个协议&#xff1f;它能带来什么好处&#xff1f;…

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; 自动驾驶风格部署和更常用的蓝绿色风…

lisp文字上标源码_创建文本/标注样式源码 - AutoLISP/Visual LISP 编程技术 - CAD论坛 - 明经CAD社区 - Powered by Discuz!...

本帖最后由 zhengxiansz 于 2014-4-27 11:27 编辑GU_xl你好&#xff01;请帮我看一下这个创建文本/标注样式源码。第一次输入IT1命令时没有报错的提示。如果重复输入IT1命令时就会提示该名称已被使用&#xff0c;是否重新定义&#xff1f;请问有什么方法可以解决吗&#xff1f;…

从前有座山,山里有座庙:递归之法

递归描述 递归调用是函数内部调用自身的过程&#xff0c;递归必须要有结束条件&#xff0c;否则会进入无限递归状态。无法停止。 我们称这个条件为&#xff08;递归基&#xff09; 递归原理 递归包括&#xff08;递推&#xff09;和&#xff08;回归&#xff09;&#xff0c;…

你只是看起来很努力_我的方法在这方面看起来很大吗?

你只是看起来很努力以下Java方法的大小是多少&#xff1f; public Collection getDescription() {SystemLibrary systemLib registry.get(SystemLibrary.class);Analysis analysis systemLib.getCurrentAnalysis(registry);return getDescription(analysis);}这个不起眼的方…

0xFFFFFF的问题

这个有两个结果&#xff1a;16777215和-1 如果是单纯的16 进制数&#xff0c;那么转换为10 进制数为16777215。相信这个转换结果很好理解&#xff1a;15*16^015*16^1...15*16^5。j即&#xff08;int型所能表示的最大值&#xff09; 第二种情况就是 0xFFFFFF 如果是在计算机中…

js模仿f11全屏_JS实现全屏预览F11功能的示例代码

老是不通过&#xff0c;没办法&#xff0c;只能是重新发布了&#xff0c;反正我就是杠上了&#xff0c;大大小小写过很多前端特效&#xff0c;当然也经常在网上copy或者修改人家的代码&#xff0c;我觉得也挺好的&#xff0c;为什么&#xff1f;&#xff01;因为我想这样&#…

懒惰学习_懒惰评估

懒惰学习最近&#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] …

买个云服务器有啥用_买了一台云服务器到底能干嘛?

提起云计算、大数据&#xff0c;好像都属于科技前沿的东西&#xff0c;总是觉得它离我们很遥远。但是科技的发展应该是要惠及普罗大众的&#xff0c;所以云计算的发展也并不是与我们毫不相干的&#xff0c;很多云计算方面的功能是我们工作生活可以用到、并解决问题的&#xff0…

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; 一旦应用程序变…

python项目管理器 宝塔面板 django 404_宝塔面板成功部署Django项目流程(图文)

上线 Django 项目记录&#xff0c;超简单&#xff0c;避免无意义的踩坑&#xff01;第一步&#xff1a;安装python管理器在宝塔在线面板安装“ python项目管理器 ”第二步&#xff1a;安装适配python版本因为服务器 centos7 系统默认的 python 版本是 2.7而我们项目是基于最新版…

leetcode(字符串专题)

5. 最长回文子串 思路

使用Spring boot,Thymeleaf,AngularJS从零开始构建新的Web应用程序–第3部分

在之前的博客中&#xff0c;我们使用Thymeleaf&#xff0c;Bower和Bootstrap构建了登录页面&#xff0c;并将其部署到了Heroku。 在此博客中&#xff0c;我们将介绍用于前端的AngularJS和在后端的Spring Boot Web服务的一些功能。 我们将从“登录/注销”部分开始。 让我们开始…