认识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. Navicat Premium的数据传输功能----将远程Mysql数据库复制到本地数据库的方法

    1.先连上本地.远程的数据库 2.在本地建一个和你要复制的远程数据库的名称一样的数据库 3.数据转移.工具-->数据传输-->填写源数据库和目标数据库-->下一步-->开始 注 ...

  2. 使用gitlab构建基于docker的持续集成(二)

    使用gitlab构建基于docker的持续集成(二) gitlab docker aspnetcore Centos配置gitlab镜像并且启动 Centos配置防火墙 windows上访问gitla ...

  3. Java数组练习(打印杨辉数组)

    打印杨辉数组 package com.kangkang.array; import java.util.Scanner; public class demo02 { public static voi ...

  4. 番外----python入门----关于pycharm

    江湖上有句话叫 "武林至尊,宝刀屠龙,号令天下,莫敢不从,倚天不出,谁与争锋". 今天,我们就来介绍一下,python编程界的"屠龙刀",pycharm. 一. ...

  5. 漏洞复现-CVE-2018-15473-ssh用户枚举漏洞

          0x00 实验环境 攻击机:Win 10 0x01 影响版本 OpenSSH 7.7前存在一个用户名枚举漏洞,通过该漏洞,攻击者可以判断某个用户名是否存在于目标主机 0x02 漏洞复现 针 ...

  6. phpMyAdmin Transformation 任意文件包含/远程代码执行漏洞

    漏洞参考 https://yq.aliyun.com/articles/679633 国外提供了一个在线测试的靶场     默认密码  root  toor https://www.vsplate.c ...

  7. mongodb 聚合(aggregate)

      MongoDB中文手册|官方文档中文版 https://docs.mongoing.com/ 聚合操作处理数据记录和 return 计算结果.聚合操作将来自多个文档的值组合在一起,并且可以对分组数 ...

  8. 自动化测试工具(基于WordCount作业)

    本自动化测试的程序用于自动化测试WordCount作业,采用Java开发(基于jdk1.8+),基于Maven来管理项目. 支持的语言和开发进度 语言 进度 Java 已测试并投入运行 C++ 开发完 ...

  9. 将表单数据转换成json字符串

    $("#theForm").serialize(); 可以获取表单的数据,但是是json字符串 需要转换成json才能正常使用

  10. C语言入门-mingw64安装+配置

    OK,大家好,结合上期所说,本期让我们来配置编译器吧! 首先先下载mingw64离线包,官网下载慢,可以去群里下载,*.7z格式(有些同学可能没有解压软件,为了照顾这部分同学,笔者提供*.exe格式的 ...