Maven的概念
Maven 是什么?
你可以把 Maven 想象成 Java 项目的"超级管理员"或"自动化助手"。
它的核心任务是项目管理 ,尤其是管理项目的构建过程 、依赖管理 和项目信息管理。
它的两大核心功能:
-
依赖管理
-
痛点:一个Java项目通常需要很多第三方"零件"(即jar包,比如连接数据库的驱动、处理JSON的工具包等)。手动去网上下载这些jar包,还要确保版本正确、处理它们之间的依赖关系,非常麻烦且容易出错。
-
Maven的解决方案 :你只需要在一个配置文件(
pom.xml)里声明需要什么"零件"(比如:"我需要一个版本为 5.1.47 的 MySQL 驱动包"),Maven 就会自动从中央仓库(可以理解为一个巨大的网上图书馆)帮你下载,并且会把它依赖的其他"零件"也一并下载好。
-
-
标准化构建流程
-
痛点:开发一个项目需要很多步骤:编译源代码 -> 运行测试 -> 打包成jar/war文件 -> 部署到服务器。每次手动执行这些命令很繁琐。
-
Maven的解决方案 :Maven 预设了一套标准的生命周期(Lifecycle)。你只需要执行一条简单的命令(比如
mvn package),Maven 就会自动、按顺序地执行编译、测试、打包等一系列操作,极大地提升了效率。
-
Maven的应用场景
maven 的应用场景,开发人员只要按着 maven 标准的目录结构进行开发即可,然后提
交代码。在测试服务器上拉取 Java 源码,然后可以使用 maven 的自动化项目构建完成项
目的清理、编译、测试、打包和安装部署等。
初识Maven
Maven安装
安装Maven前需要进行安装jdk1.8或以上版本
Maven官网
http://maven.apache.org/download.html
下载后解压到相应的目录即可(无中文路径)
Maven安装目录分析

Maven的环境变量


验证是安装成功 WIN+R 输入cmd 输入mvn -version

Maven的第一个项目
按照约定创建 Maven项目路径

在Hello根目录建立pom.xml

在 src/main/java/cn/tx/maven 目录下新建文件 Hello.java

创建HelloTest.java文件
在/src/test/java/cn/tx/maven 目录下新建测试文件 HelloTest.java

进行Maven操作
- 打开 cmd 命令行,进入 Hello 项目根目录执行 mvn compile 命令,查看根目 录变化
- cmd 中继续录入 mvn clean 命令,然后再次查看根目录变化
- cmd 中录入 mvn clean compile 命令, 查看根目录变化
- cmd 中录入 mvn clean test 命令,查看根目录变化
- cmd 中录入 mvn clean package 命令,查看根目录变化
- cmd 中录入 mvn clean install 查看仓库会把项目安装到仓库里
Maven命令详解
| 命令阶段 | 作用 | 生命周期位置 |
|---|---|---|
clean |
删除构建产物(删除target) | 独立生命周期 |
compile |
编译主代码(生成target) | Default 生命周期 |
test |
运行单元测试(测试test目录中的案例代码) | Default 生命周期 |
package |
打包可部署文件(打包 生成对应格式的包 在target目录) | Default 生命周期 |
install |
安装到本地仓库 | Default 生命周期 |
进阶练习:
接下来以同样的方式 在创建第二个Maven 导入第一个项目的包进行联系
Maven进阶
pom.xml文件
就像 Make 的 MakeFile、Ant 的 build.xml 一样,Maven 项目的核心是
pom.xml。POM( Project Object Model,项目对象模型 ) 定义了项目的基本信息,
用于描述项目如何构建,声明项目依赖,等等。Gredele
坐标
概念
在 Maven 中 坐 标 是 构 件 的 唯 一 标 识 , Maven 坐 标 的 元 素 包 括 groupId、
artifactId、version、packaging、classifier。上述 5 个元素中,groupId、
artifactId、version 是必须定义的,packaging 是可选的 ( 默认为 jar )。
groupId:组织标识,一般为:公司网址的反写+项目名
artifactId:项目名称,一般为:项目名-模块名
version:版本号 形式为 0.0.1-SNAPSHOT:
第一个 0 表示大版本号,第二个 0 表示分支版本号,第三个 0 表示小
版本号
SNAPSHOT -- 快照版本,ALPHA -- 内侧版本,BETA -- 公测版本,
RELEASE -- 稳定版本,GA -- 正式发布
packaging:打包的方式,如:pom, jar, maven-plugin, ejb, war, ...
clissifier:用来帮助定义构件输出的一些附属构件。
依赖
当编写 Java 代码时,我们总是需要一些库,例如,做单元测试我们需要 JUnit 库。
对于更大的项目,我们可能需要创建自己的库并在不同的部分使用它的项目。不同的项目需
要不同版本的库。 保持项目最新的库 JAR 文件的正确版本不是一个容易的任务。
每个外部 JAR 可能还依赖于其他外部 JAR 文件等。以递归方式下载所有这些外部依赖
JAR 文件并确保下载正确的版本是一项巨大的任务。
当项目越来越大,我们将需要越来越多的外部依赖。
Maven 将下载它们并将它们放在您的本地 Maven 存储库中。
我们可以在 POM 文件中的 dependencies 元素内指定依赖关系。
我们在不确定所需引用的第三方依赖包的坐标时,通过 maven 的中央仓库进行查找,网
址: https://mvnrepository.com/;

Maven项目在开发工程中有三套classpath
主代码:main下面的都是主代码在编译的时候的依赖
测试代码:test下是测试代码编译的时候的依赖
运行时:main代码在运行的时候对包的依赖
依赖范围的使用,通过在引用第三方依赖时的标签进行设置,例

共6种scope,包括:complite,provided,runtime,test,system、import。
例如上图的junit,只在测试中使用,则选择test即可,默认为compi
Compile:编译依赖范围。默认使用此依赖范围,其下的maven依赖,对于编译,
测试,运行classpath都有效。
Test:测试依赖范围。只对测试classpath有效,编译主代码或运行项目时无
Provided:已提供依赖范围。其对于编译与测试classpath有效,运行时无效。e
如在web开发时,只有在编译和测试时才用到servlet-api,将其设置为此范
围,在运行时servlet-api由web容器提供,无须依赖。并且在打war包时,
此范围的依赖不会打在WEB-INF/lib下。
Runtime:运行时依赖范围。与provided相对,运行时classpath有效。典
型例子如jdbc(编写是接口规范运行是提供具体实现类需要jar包)。

依赖传递
应用场景:
如果你现在是A项目 A项目依赖B项目
但B项目依赖C项目 你的A项目在依赖B项目是也会导入C项目
依赖阻断
就像上面说的A项目会自动导入C项目 但是你A项目现在不想要C项目了
可以在B项目中的pom文件中找到C项目这个依赖 写一个标签
<optional> 这样你的A项目在导入B项目的时候 不会在导入C项目

依赖阻断
如果我们需要在依赖中明确的排除掉某一依赖,则可以使用exclusion属性,排除掉
引用的依赖,如图:

继承
继承就是避免重复,maven的继承也是这样,它还有一个好处就是让项目更加安全。
比如我们在项目开发的过程中,可能多个模块独立开发,但是多个模块可能依赖相同的公共
模块,比如说每个模块都需要javaseo-utils,在编译的时候,
maven-compiler-plugin插件也要被引入,maven仓库地址以及发布目录都是相同的
配置。我们可以使用Maven的继承功能,把公共的配置信息写到父模块中,子模块只要继
承了该父模块,也会继承父模块的配置信息。
可以继承的pom元素

Maven私服架构
正式开发,不同的项目组开发不同的工程。maven-dao工程开发完毕,发布到私服
maven-service从私服下载dao。
公司在自己的局域网内搭建自己的远程仓库服务器,称为私服,私服服务器即是
公司内部的maven远程仓库,每个员工的电脑上安装maven软件并且连接私服服务
器,员工将自己开发的项目打成jar并发布到私服服务器,其它项目组从私服服务器下
载所依赖的构件(jar)。
私服还充当一个代理服务器,当私服上没有jar包会从互联网中央仓库自动下载。
Nexus 介绍
Nexus是Maven仓库管理器,通过nexus可以搭建maven仓库,同时nexus还
提供强大的仓库管理功能,构件搜索功能等。
Maven私服实战
首先安装nexus
到官网下载nexus
1 解压自己下载的nexus文件 存放到一个不含中文目录
查看conf文件下的nexus.properties配置文件,可以修改对应的配置

2 nexus的安装命令:使用管理员运行cmd命令窗口,切换目录
nexus\nexus-2.12.0-01\bin目录下,执行nexus.batinstall进行安装。执行nexus.batstart
启动服务执行nexus.batstop停止服务。
如果显示没有这个命令可以试试加上 ./
比如 ./nexus.bat install
3 nexus的卸载命令:使用管理员运行cmd命令窗口,切换目录
nexus\nexus-2.12.0-01\bin目录下,执行nexus.batuninstall进行卸载
4访问图形化界面:打开浏览器,输入http://localhost:端口号/nexus访问

5点击login,进行登录。用户名:admin密码:
我安装nexus时候遇到的问题
1 nexus无法启动
原因:
我的环境变量配置的jdk过高 需要jdk8 修改环境变量中jdk位置
2 修改成jdk8后 网页无法进入
原因 :
电脑上jdk过多 nexus不知道使用哪个 指定jdk8
根据我的目录找到自己对应nexus中的文件 wrapper.conf目录


可能实际情况不同 可以查看日志文件精准找到自己的问题
nexus 仓库类型
1hosted,宿主仓库,部署自己的jar到这个类型的仓库,包括releases和snapshot
两部分,Releases公司内部发布版本仓库、Snapshots公司内部测试版本仓库
2proxy,代理仓库,用于代理远程的公共仓库,如maven中央仓库,用户连接私
服,私服自动去中央仓库下载jar包或者插件。
3group,仓库组,用来合并多个hosted/proxy仓库,通常我们配置自己的maven连
接仓库组。Group仓库组也是可以自己进行定制的。

将项目发布到私服
需要在当前电脑上配置maven环境 并修改Setting文件 配置连接私服的用户和密码
此用户名和密码用于私服校验,因为私服需要知道上传的账号和密码是否和私服中的账号和密码一致。
在servers节点下进行配置

配置项目pom.xml,配置私服仓库的地址,本公司的自己的jar包会上传到私服的
宿主仓库,根据工程的版本号决定上传到哪个宿主仓库,如果版本为release则上传到
私服的release仓库,如果版本为snapshot则上传到私服的snapshot仓库。

注意 这里的id标签要和setting.xml上的一样
在该工程中执行deploy 命令 发布到私服上

查看结果


从私服下载jar包
在maven中的Settings.xml配置私服的镜像文件

先把自己的某个项目发布到私服中,然后删除掉本地仓库中的jar包,再使用其他项
目去依赖该jar包,查看是否从私服中下载。
在其他项目中引入该坐标依赖。
把本地仓库中 上传到私服的项目删除掉
在进行测试看看是否能够引入成功
引入依赖

在添加上pom配置文件,添加仓库配置

进行测试

测试成功