一、Maven的概念
1 什么是Maven
跨平台 的项目管理工具。主要服务于基于Java平台的项目构建,依赖管理和项目信息管理。
什么是理想的项目构建?
高度自动化,跨平台,可重用的组件,标准化的流程。
2 什么是依赖管理
对第三方依赖包的管理,可以连接互联网下载项目所需第三方jar包。
对自己开发的模块的管理,可以像引用第三方依赖包一样引用自己项目的依赖包。

3 什么是项目构建
项目构建:是一个从编写源代码到编译、测试、运行、打包、部署的过程。
传统项目:
打开Idea编写源代码和配置文件,对源代码进行编译,可以使用Junit进行单元测试,把项目打成war包,部署到Tomcat服务器中运行。
maven项目:
maven将项目构建过程进行标准化,每个阶段都可以使用一个命令来完成。
清理 --> 编译 --> 测试 --> 报告 --> 打包 --> 部署
4 Maven的优点
拥有约定,知道你的代码在哪里,放到哪里去。
拥有一个生命周期,例如执行 mvn install 就可以自动执行编译,测试,打包等构建过程。
只需要定义一个pom.xml,然后把源码放到默认的目录,Maven帮你处理其他事情。
拥有依赖管理,仓库管理。
二、初始Maven
1 Maven安装目录分析

bin:含有mvn运行的脚本
boot:含有plexus-classworlds类加载器框架
conf:含有settings.xml配置文件
lib:含有Maven运行时所需要的java类库
LICENSE.txt, NOTICE.txt, README.txt针对Maven版本,第三方软件等简要介绍
2 Maven仓库
仓库是用来统一存储所有Maven共享构建的位置,可根据Maven坐标定义每个构建在仓库中唯一存储路径。
groupId/artifactId/version/artifactId-version.packaging
仓库的分类:
本地仓库:每个用户只有一个本地仓库
远程仓库:(1)中央仓库:Maven默认的远程仓库 http://repol.maven.org/maven2
(2)私服:一种特殊的远程仓库,它是架设在局域网内的仓库
三、Maven的进阶
1 pom.xml文件
Maven项目的核心是pom.xml文件。Pom定义了项目的基本信息,用于描述项目如何构建,声明项目依赖等等。
2 坐标
2.1 概念
在Maven中坐标是构件的唯一标识,Maven坐标的元素包括groupId、artifactId、version(必须定义)、packaging(可选定义)、classifier。
2.2 含义
groupId:组织标识,一般为:公司网址的反写+项目名
artifactId:项目名称,一般为:项目名-模块名
version:版本号 形式为0.0.1-SNAPSHOT:
第一个 0 表示大版本号,第二个 0 表示分支版本号,第三个 0 表示小版本号
SNAPSHOT -- 快照版本,ALPHA -- 内侧版本,BETA -- 公测版本,RELEASE -- 稳定版本,GA -- 正式发布
packaging:打包的方式,如:pom, jar, maven-plugin, ejb, war, ...
clissifier:用来帮助定义构件输出的一些附属构件。
3 依赖
3.1 依赖的使用

属性说明:
- 三维坐标:引用依赖包的三维坐标,用来定位该依赖包;
- scope: 控制该依赖包在什么情况下会被加到 classpath 中;
3.2 依赖的范围
(1)3中classpath:
- 主代码:main下面的都是主代码在编译时的依赖
- 测试代码:test下是测试代码编译的时候的依赖
- 运行时:main代码在运行的时候对包的依赖
依赖范围的使用,通过引用第三方依赖时的<scope></scope>标签进行设置,例如:

共6种scope,包括::compile 、provided 、runtime 、test、system、import。

3.3 依赖传递和可选依赖
(1)依赖传递
第一直接依赖:HelloFriend项目依赖Hello项目
第二直接依赖:MakeFriend项目依赖HelloFriend项目
(2)依赖范围对依赖传递的影响
- 完全传递:compile、runtime
- 不传递:provided、test、system、import
(3)依赖阻断
表示当HelloFriend被其他项目依赖时,不传递Hello的依赖至依赖于HelloFriend的项目


(4)可选依赖
exclusion属性

3.4 仓库
(1)概念:项目中依赖的第三方库的位置
(2)类型:本地、中央、远程
(3)构件:任何一个依赖、插件或者项目构建的输出
(4)依赖搜索顺序:本地库----->中央仓库(有则下载到本地仓库)--->远程仓库(没有则报错)
3.5 Maven的继承和聚合
Maven聚合需要5个子模块:前台 后台 公共模块 图片服务器 外层的父工程(不需要写代码)
打jar包可以默认不勾选模板



四、Maven私服架构
私服:公司内部的Maven远程仓库,员工将自己开发的项目打成jar包并发布到私服服务器,其他项目组从私服服务器下载所依赖的构件(jar包);私服还充当代理服务器
Nexus:Maven仓库管理器
1 Maven私服实战
(1)安装nexus
(2)将项目发布到私服:修改settings.xml文件【私服校验】----->
<!-- 定义稳定版本的id名称,用户名密码 -->
<server>
<id>releases</id>
<username>admin</username>
<password>admin123</password>
</server>
<!-- 定义开发版本的id名称,用户名密码 -->
<server>
<id>snapshots</id>
<username>admin</username>
<password>admin123</password>
</server>
------------->配置项目pom.xml【配置私服仓库地址,公司自己的jar包会上传到私服宿主仓库】
< distributionManagement**>**
< repository**>**
< id**>** releases**</** id**>**
< url**>** http://localhost:8079/nexus/content/repositories/releases/**\</** url**>**
</ repository**>**
< snapshotRepository**>**
< id**>** snapshots**</** id**>**
< url**>** http://localhost:8079/nexus/content/repositories/snapshots/**\</** url**>**
</ snapshotRepository**>**
</ distributionManagement**>**
------------------>执行deploy命令------------>查看私服结果
(3)从私服下载jar包:修改setting.xml文件
<mirror>
<!-- id名称 -->
<id>nexusmaven</id>
<!-- 表示拦截所有的请求,都重定向到私服,从私服下载jar包,私服没有再去中央仓库下载 -->
<mirrorOf>*</mirrorOf>
<name>nexus maven</name>
<!-- 私服的组地址 -->
<url>http://localhost:8079/nexus/content/groups/public/\</url>
</mirror>
<!-- 下载jar包配置 --><profile>
<!--profile的id -->
<id>dev</id>
<repositories>
<repository> <!--仓库id,repositories可以配置多个仓库,保证id不重复 -->
<id>nexus</id> <!--仓库地址,即nexus仓库组的地址 -->
<url>http://localhost:8079/nexus/content/groups/public/\</url> <!--是否下载releases构件 -->
<releases>
<enabled>true</enabled>
</releases> <!--是否下载snapshots构件 -->
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories> <!-- 插件仓库,maven的运行依赖插件,也需要从私服下载插件 -->
<pluginRepository> <!-- 插件仓库的id不允许重复,如果重复后边配置会覆盖前边 -->
<id>public</id>
<name>Public Repositories</name>
<url>http://localhost:8079/nexus/content/groups/public/\</url>
</pluginRepository>
</pluginRepositories>
</profile>
------------->激活配置
<activeProfiles>
<activeProfile>dev</activeProfile>
</activeProfiles>
(4)第三方jar包发布到私服
jar包安装到本地仓库---------->setting.xml配置文件
<server>
<id>thirdparty</id>
<username>admin</username>
<password>admin123</password>
</server>
----------->上传到私服
mvn deploy:deploy-file -DgroupId=com.alibaba -DartifactId=fastjson -Dversion=1.1.37 -Dpackaging=jar -Dfile=fastjson-1.1.37.jar -Durl=http://localhost:8079/nexus/content/repositories/thirdparty/ -DrepositoryId=thirdparty