认识Maven



Maven是Apache软件基金会组织维护的一款自动化构建工具, 专注于Java平台工程的项目构建和依赖管理:

1:项目构建

构建不是创建,创建一个工程并不等于构建一个项目,用Maven可以管理项目开发的整个生命周期

2:依赖管理

管理项目依赖的所有jar文件,Maven项目依赖于一个库,而这个库又依赖其他库,只需要加上直接依赖的库,间接依赖的库也会加入到项目中



假设上图,引入spring-mvc后,spring-mvc依赖的spring-core等库也会加入到项目里面

Maven下载安装

Maven 是一个基于 Java 的工具,所以要做的第一件事情就是安装JDK,下载安装只需要把下载的文件解压到指定目录,然后配置环境变量即可:

1:准备依赖的JDK

2:下载安装

3:配置环境变量

4:测试是否安装成功

环境变量配置:



新建系统变量MAVEN_HOME,设置变量值为解压后的maven目录



在path环境变量下新增%MAVEN_HOME%\bin



打开cmd输入mvn -v验证是否配置成功

Maven能用来做什么

1:添加第三方的jar

2:管理jar包之间的依赖关系

3:获取第三方jar包

4:将项目拆分成多个工程模块

如果不使用maven,需要去各个框架网站上下载对应的包,然后引入到项目中,遇到依赖冲突还需要自己去逐一排查

简单示例:

1:archetype:generate(交互模式)

使用mvn archetype:generate命令,需要手动去输入项目相关的信息



2:archetype:generate(非交互模式)

mvn archetype:generate -DgroupId=com.companyname.bank -DartifactId=consumerBanking -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

不需要手动输入信息,自动创建项目

3:通过IDE创建Maven项目

Maven核心概念

开发目录

约定配置:

Maven提倡使用一个共同的标准目录结构,准守约定大于配置的原则

坐标和仓库

1:坐标

空间中的三维坐标,物理地址等都可以理解为坐标

Maven构建的唯一标识符:groupId、artifactId、version

2:仓库

本地仓库:运行Maven时,需要的任何构件都是直接从本地仓库获取

远程仓库;中央仓库;私服其他第三方库



首先,Maven会通过坐标定位到本地仓库中的jar,如果本地仓库没有找到,就会去私服寻找,最后才会到中央仓库

3:仓库依赖顺序

本地仓库 – 私服 – 中央仓库

POM文件

POM(project object model,项目对象模型)是Maven工程的基本工作单元,是一个XML文件,包含了项目的基本信息,用来描述项目如何构建,声明项目的依赖等

POM配置:

1:项目依赖

2:插件

3:执行目标

4:项目构建profile

5:项目版本

6:项目开发者列表

7:相关邮件列表信息

执行任务或者目标的时候:

1:Maven会在当前目录中查找POM

2:读取POM,获取所需要的配置信息,然后执行目标

POM文件内容

下面简要介绍下POM文件内容:

POM文件项目基础信息:

    <!--项目的全球唯一标识符-->
<groupId>asia.banseon</groupId>
<!-- 构件的标识符-->
<artifactId>banseon-maven2</artifactId>
<!--项目产生的构件类型,例如jar、war、ear、pom-->
<packaging>jar</packaging>
<!--项目当前版本,格式为:主版本.次版本.增量版本-限定版本号-->
<version>1.0-SNAPSHOT</version>
<!--项目的名称, Maven产生的文档用-->
<name>banseon-maven</name>
<!--父项目-->
<parent>
<!--被继承的父项目的构件标识符-->
<artifactId/>
<!--被继承的父项目的全球唯一标识符-->
<groupId/>
<!--被继承的父项目的版本-->
<version/>
</parent>

maven中的仓库分为两种,snapshot快照仓库和release发布仓库。snapshot快照仓库用于保存开发过程中的不稳定版本,release正式仓库则是用来保存稳定的发行版本

snapshot会不停的deploy,其他系统或者个人使用的时候回自动加载最新的版本

POM文件插件信息:

<build>
<!-- 可使用的插件列表 -->
<plugins>
<!--plugin元素包含描述插件所需要的信息。 -->
<plugin>
<!--插件定位坐标三元素:groupId + artifactId + version --
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.1</version>
<executions>
<execution>
</execution>
</executions>
</plugin>
</plugins>
</build>

POM文件依赖信息:

<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
<type></type>
<optional></optional>
<exclusions>
<exclusion>
</exclusion>
</exclusions>
</dependency>
</dependencies>

Maven依赖管理

多模块项目(包含成千上百个模块或者子模块),模块之间的依赖关系非常复杂,管理起来也很困难,针对这个问题,Maven提供了一个核心特性:依赖管理

依赖管理主要有两个部分:

1:依赖传递性

2:依赖范围

传递依赖:

一种情况下比如:A依赖B库,C依赖A,那么C项目也需要使用B库

Maven通过读取POM文件,找出项目之间的依赖关系,我们只需要在每个项目中定义好直接的依赖关系,其他的依赖关系,Maven会自动完成

依赖冲突

依赖冲突造成的原因:依赖传递造成的

解决依赖冲突



依赖范围:

传递依赖发现可以通过使用如下的依赖范围来得到限制:

构建生命周期

1:构建生命周期

Maven构建生命周期定义了一个项目构建和发布的过程

2:Maven生命周期工作原理

生命周期中各个步骤的工作是插件(plugin)来负责完成的。

一个插件通常完成一个或多个步骤的工作,每个步骤的工作对应插件的一个目标(goal)。不同的插件结 合起来,就可以完成整个项目的构建,例如:编译插件,compiler;测试插件,surefire;打包插件,jar; 安装插件,install;部署插件,deploy

三类生命周期

Maven标准的生命周期 :

1:Default Lifecycle:构建部署项目

2:Clean Lifecycle:清理项目

3: Site Lifecycle:生成项目站点

项目构建的步骤



Maven项目构建阶段

验证:验证项目是否正确且所有必须信息是可用的

编译:将Java源程序编译为字节码(.class)文件

测试:对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性

打包:将一个工程封装为一个压缩文件用于安装或部署

检查:对集成测试的结果进行检查,以保证质量达标

安装:特指Maven环境下将打包的结果——jar包或war包安装到本地仓库中 部署: 将打包的结果部署到远程仓库或将war包部署到运行服务器上运行 Maven可以自动实现上叙过程的所有操作

周期阶段

Clean 清理项目周期阶段

pre-clean:执行一些需要在clean之前完成的工作

clean:移除所有上一次构建生成的文件

post-clean:执行一些需要在clean之后立刻完成的工作

Site 生命周期阶段

pre-site:执行一些需要在生成站点文档之前完成的工作

site:生成项目的站点文档

post-site: 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备

site-deploy:将生成的站点文档部署到特定的服务器上

构建多模块系统



现在需要将上面三个部分拆分复用该怎么办?

聚合

基本概念:Maven聚合是为了能够使用一条命令就能构建多个模块

聚合模块的打包方式必须为pom,否则无法完成构建

    <modelVersion>4.0.0</modelVersion>
<groupId>com.dragon</groupId>
<artifactId>flowable</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>flowable-api</module>
<module>flowable-core</module>
<module>flowable-manager</module>
<module>flowable-server</module>
<module>flowable-parent</module>
</modules>

继承

继承是为了消除重复,我们把很多相同的配置提取出来,例如:groupId,version等

父模块的打包方式必须为pom,否则无法构建项目

父模块:

   <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.0.RELEASE</version>
</parent>
<packaging>pom</packaging>
<version>1.0</version>

子模块:

 <parent>
<groupId>com.dragon</groupId>
<artifactId>flowable-parent</artifactId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>flowable-api</artifactId>
<version>1.0-SNAPSHOT</version>

聚合与继承

一:聚合和继承的关系

1:聚合模块知道它聚合了哪些模块,但是被聚合的模块不知道聚合模块的存在

2:父模块不知道子模块的存在,但是子模块都必须知道自己的父模块是谁

二:聚合和继承的作用

通过Maven的聚合与继承特性,可以更加方便的管理和构建项目了

Maven相关知识总结的更多相关文章

  1. 0.1 Maven相关知识(项目开发基础)

    一.Maven 1.1Maven是什么 Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件. Maven这个单词来自于意第绪语(犹太语),意为知识的 ...

  2. 【Python五篇慢慢弹(5)】类的继承案例解析,python相关知识延伸

    类的继承案例解析,python相关知识延伸 作者:白宁超 2016年10月10日22:36:57 摘要:继<快速上手学python>一文之后,笔者又将python官方文档认真学习下.官方给 ...

  3. 移动WEB像素相关知识

    了解移动web像素的知识,主要是为了切图时心中有数.本文主要围绕一个问题:怎样根据设备厂商提供的屏幕尺寸和物理像素得到我们切图需要的逻辑像素?围绕这个问题以iphone5为例讲解涉及到的web像素相关 ...

  4. listener监听器的相关知识

    从别人的博客上我学习了listener的相关知识现在分享给大家 1.概念: 监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上 ...

  5. UIViewController相关知识

    title: UIViewController 相关知识date: 2015-12-13 11:50categories: IOS tags: UIViewController 小小程序猿我的博客:h ...

  6. 【转】java NIO 相关知识

    原文地址:http://www.iteye.com/magazines/132-Java-NIO Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的 ...

  7. NSString使用stringWithFormat拼接的相关知识

    NSString使用stringWithFormat拼接的相关知识 保留2位小数点 1 2 3 4 //.2代表小数点后面保留2位(2代表保留的数量) NSString *string = [NSSt ...

  8. iOS网络相关知识总结

    iOS网络相关知识总结 1.关于请求NSURLRequest? 我们经常讲的GET/POST/PUT等请求是指我们要向服务器发出的NSMutableURLRequest的类型; 我们可以设置Reque ...

  9. 电路相关知识--读<<继电器是如何成为CPU的>>

    电路相关知识–读<<继电器是如何成为CPU的>> */--> *///--> *///--> 电路相关知识–读<<继电器是如何成为CPU的> ...

随机推荐

  1. 国际标准时间格式ISO8601

    日期表示法 年由4位数字组成YYYY,或者带正负号的四或五位数字表示±YYYYY.以公历公元1年为0001年,以公元前1年为0000年,公元前2年为-0001年,其他以此类推.应用其他纪年法要换算成公 ...

  2. HTTP 1.x 学习笔记 —— Web 性能权威指南

    HTTP 1.0的优化策略非常简单,就一句话:升级到HTTP 1.1.完了! 改进HTTP的性能是HTTP 1.1工作组的一个重要目标,后来这个版本也引入了大量增强性能的重要特性,其中一些大家比较熟知 ...

  3. sql where 1=1 的详细解释

    原文来自:https://blog.csdn.net/zc474235918/article/details/50544484 看一下这两个句子: select * from user select ...

  4. 按照阿里巴巴规范创建Java线程池

    前言 Executors Executors 是一个Java中的工具类.提供工厂方法来创建不同类型的线程池. 常用方法: 1.newSingleThreadExecutor   介绍:创建一个单线程的 ...

  5. 【ZeyFraのJavaEE开发小知识01】@DateTimeFomat和@JsonFormat

    @DateTimeFormat 所在包:org.springframework.format.annotation.DateTimeFormat springframework的注解,一般用来对Dat ...

  6. 【随便写写】印象笔记,WordPress,CSDN 等 写博客的不同

    之前有的文章,写在了印象笔记里面,有的文章,写在了自己的WordPress博客里面,但是,感觉还是需要在主流平台分享一下文章的.就再次写写文章吧.(PS:公众号最重要的不是写作,而是排版) 说说几个这 ...

  7. 第6章 for循环

    目标 掌握for循环的使用方法 理解for循环的嵌套 在第3章中,我们学习了times循环.times循环可以让一段代码重复执行指定的次数. 本章我们将学习另一种循环结构--for循环.它同样能让一段 ...

  8. 只需2分钟!PC端的报表即可转换成手机报表

    转: 只需2分钟!PC端的报表即可转换成手机报表 手机制作报表,这个大家不知有没有尝试过,虽然我们平时都用电脑做,但是电脑要是不在身边了,手机就可以用来应应急.但其实小编并没有在手机上制作报表的实践经 ...

  9. Linux增删改查移文件、文件夹

    关于Linux中文件基本处理命令 (1)添加文件.文件夹(图例):touch Demo命令创建文件(Demo)为文件名. 即mkdir Temp命令为创建文件夹(Temp)为文件夹名. 创建文件.文件 ...

  10. IDEA中便捷内存数据库H2的最简使用方式

    在IDEA中有时候为了练习,需要使用到数据库,但如果自己工作或开发机子上本来没有安装数据库,也没有可用的远程数据库时,我们可以直接在IDEA环境上使用便捷式的内存数据库H2,关于H2更多知识就自己去找 ...