【学】Maven 笔记 | 不食花生的猫
第一章 Maven 基础
网页地址
- 视频地址:黑马程序员Maven全套教程,maven项目管理从基础到高级,Java项目开发必会管理工具maven_哔哩哔哩_bilibili
- 依赖查询:https://mvnrepository.com/
-
Maven :Maven – Available Plugins
-
Nexus :Download
Maven 标签
resources: 资源文件配置信息
resource: 资源文件配置信息
testResources: test 资源文件配置信息
testResource: test 资源文件配置信息
以下内容属于 dependencies
groupId: 【组织 ID】定义当前 Maven 项目隶属组织名称(通常是域名反写,例如 org.mybaits)
artifactId: 【项目 ID】定义当前 Maven 项目名称(通常是模块名称,例如 CRM、SMS)
version: 【版本号】定义当前项目的版本号
packaging: 【jar/war】定义该项目的打包方式
optional: 是否对上级隐藏 true / false
exclusions: 排除掉某些
exclusion: 具体排除掉哪一个 ()
注意:不写版本 见代码片段 1.2
scope: 范围
- 在主程序范围能不能用 【compile 文件夹范围内 】
- 在测试范围能不能用【 test 】
- 是否参与打包【 package 】
dependencyManagement:【依赖管理】 在 父pom 中做依赖管理
build
- build 构建
- plugins 插件(们)
- plugin 插件
代码片段 1.1
<plugins>
<plugin>
<groupId> …… </groupId>
<artifactId> …… </artifactId>
<version> …… <version>
<exclusions> <!-- 执行 -->
<exclusions>
<!--执行位置>
<goals>
<goal>jar</goal>
<goals>
<!-- 参考声明周期全过程 -->
<phase> generate-test-resources <phase>
<exclusions>
</exclusions>
</plugin>
</plugins>
表 1.1 scope 范围
| scope 参数 | 主程序 | 测试程序 | 参与打包 | 典型 |
| compile | 🙆🏻♀️ | 🙆🏻♀️ | 🙆🏻♀️ | log4j |
| test | 🙆🏻♀️ | junit | ||
| provided | 🙆🏻♀️ | 🙆🏻♀️ | servlet-api | |
| runtime | 🙆🏻♀️ | jdbc |
表 1.2 scope 以来传递中的范围问题
| 项目 2 \ 项目 1 | compile | test | provided | runtime |
| compile | compile | test | provided | runtime |
| test | ||||
| provided | ||||
| runtime | runtime | test | provided | runtime |
代码 1.2 排除下级依赖
<dependency>
<groupId>父类 组名</groupId> (定义 <parent> 之后可以删除)
<artifactId>父类 artifactId</artifactId>
<version>父类 版本</version> (定义 <parent> 之后可以删除)
<!--排除掉以下-->
<executions>
<!-- 排除掉 a-->
<execution>
<groupId>a 的 groupId</groupId>
<artifactId>a 的 artifactId</artifactId>
</execution>
</executions>
</dependency>
依赖传递
- 若 b 项目引用 a 项目作为依赖,那么 a 项目引用的依赖 b 也引用
- 直接依赖:直接引用的依赖
- 间接依赖:通过引用其他项目获取其他项目的依赖
依赖冲突问题
- 深度优先原则:层级越浅优先级越高(直接依赖>间接以依赖)
- 声明优先原则:两个间接以来全都是 2 层,那么看引用他们依赖的 a 与 b ,谁在前面使用谁的
- 后者覆盖原则:当同一个 pom 文件中出现了同一个依赖的不同版本,后者覆盖前者
- 对上级隐藏 :true
- 排除下级依赖:
- Maven 生命周期与插件
全部过程

第二章 Maven 高级
分模块开发思路
- 将 controller 层、service 层等都单独划分为一个单独的 Maven 模块,通过接口进行连接
配置管理 | (插件同理)
配置一个新的 pom 文件用于管理所有的 pom
packaging:
- 聚合 pom
- 后端 jar
- web war
<packaging> pom </packaging> <!-- 说明此文件专门用于配置管理 -->
<modules>
<module> 各层级文件的名称 </module>
<module>../ssm_pojo</module>
<module>../ssm_dao</module>
<module>../ssm_service</module>
<module>../ssm_controller</module>
……
</modules>
继承
在 父 pom 文件中定义所有的依赖
父 pom:
<dependencyManagement>
<dependencies>
<dependency>
也可以写自己的项目,没两样
</dependency>
<dependency>
<groupId> …… </groupId>
<artifactId> …… </artifactId>
<version> …… <version>
</dependency>
</dependencies>
</dependencyManagement>
子 pom : dependency 中不用写 version
<parent>
<groupId> …… </groupId>
<artifactId> …… </artifactId>
<version> …… <version>
<!-- 父工程 pom.xml 文件的地址-->
<relativePath> ../ssm/pom.xml </relativePath>
</parent>
<dependencies>
<dependency>
<groupId> …… </groupId>
<artifactId> …… </artifactId>
</dependency>
</dependencies>
同理插件也可以继承,同样删除 version
继承与聚合
- 作用
- 聚合用于快速构建项目
- 继承用于快速配置
- 相同点
- 聚合与继承的 pom.xml 文件打包方式均为 pom,可以将两种关系只做到同一个 pom 文件中
- 聚合与集成均属于设计型模块,并无实际的模块内容。
- 不同点
- 聚合是在当前模块中的配置关系,聚合可以感知到参与聚合的模块有哪些
- 继承是在子模块中配置关系,父模块无法感知哪些模块集成了自己
第三章 自定义变量
<properties>
<spring.version>1.2.3</spring.version>
</properties>
<!-- 使用格式 -->
${spring.version}
<!-- 直接使用项目的 version -->
<version>${version}</version>
<!-- 读取 settings.xml 文件中的值 -->
${settings.localRepository}
<!-- 读取 Java 系统属性 -->
${user.home}
<!-- 使用: mvn help:system 可以查看系统环境变量 -->
第四章 版本管理
工程版本
- SNAPSHOT(快照版本)
- 项目开发过程中,为方便团队成员合作,解决模块间互相依赖和实时更新的问题,开发者对每个模块进行构建的时候,输出的临时性版本叫做快照版本(测试阶段版本)
- 快照版本会随着开发的进站不断更新
- RELEASE(发布版本)
- 项目开发到进入阶段里程碑后,向团队外部发布较为稳定的版本,这种版本对应的构建文件是稳定的,几遍进行功能的后续开发,也不会改变当前发布版本的内容,这种版本成为发布版本
功能版本号约定
- 约定规范
- ...
- 主版本:表示项目重大架构的变更,如 Spring5 相较于 Spring4
- 次版本:表示有较大的的功能增加和变化,或者全面系统的修复漏洞
- 增量版本:表示有重大漏洞修复
- 里程碑版本:表示一个版本的里程碑(版本内部》。这样的版本同下一个正式版本相比,相对来说不是很稳定,有待更多的测试
- 范例
- 5.1.9.RELEASE
第五章 多环境
配置资源文件对应信息
- 在 pom 文件中设定配置文件路径
- 开启加载 pom 属性过滤功能
- 使用 ${属性名} 格式引用 pom 属性
<properties>
<jdbc.username> …… </jdbc.username>
</properties>
<resources>
<resource>
<directory>../ssm_dao/src/main/resources</directory>
<directory>${project.basedir}/src/main/resources</directory>
<filtering>true</filtering>
<resource>
</resources>
<!-- jdbc.properties -->
jdbc.username=${jdbc.username}
定义 生产/开发 环境
<profiles>
<!-- 定义具体的环境:生产环境 -->
<profile>
<!-- 定义环境唯一名称 -->
<id> pro_env </id>
<!-- 定义环境中专用的属性值 -->
<jdbc.url> url1 </jdbc.url>
<!-- 默认使用这个配置 -->
<activeByDefault>true</activeByDefault>
</profile>
<!-- 定义具体的环境:开发环境 -->
<profile>
<id> dev_env </id>
<!-- 定义环境中专用的属性值 -->
<jdbc.url> url2 </jdbc.url>
</profile>
</profiles>
使用
- maven 中加入一个新的生命周期
- 指令为:install -P dev_env
第六章 跳过测试
使用场景
- 整体模块功能未开发
- 模块中某个功能未开发完毕
- 单个功能更新调试导致其他功能失败
- 快速打包
- ……
使用方法
插件:maven helper
- 方案 1:直接使用 IDEA 进行屏蔽
- 方案 2:选中 pom 文件,右键 run以下命令:install -D skipTests
- 方案 3:build 中设置跳过测试
<build>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
<configuration>
<!-- 跳过测试 -->
<skipTest>true</skipTest>
</configuration>
<configuration>
<!-- 指定测试 -->
<includes>
<include>**/Demotest.java</include>
</includes>
<!-- 排除以下进行测试 -->
<excludes>
<exclude>**/User*Test.java</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
第七章 Nexus 私服搭建与使用
Nexus私服
- 地址:Download
- 启动:进入 bin 文件夹 nexus run
- 访问:localhost:8081
仓库分类
- 宿主仓库 hosted
- 保存无法从中央仓库获取的资源
- 自主研发
- 第三方非开源项目
- 保存无法从中央仓库获取的资源
- 代理仓库 proxy
- 代理远程仓库,通过 nexus 访问其他公共仓库,例如中央仓库
- 仓库组 group
- 将若干个仓库组成一个群组,简化配置
- 仓库组不能保存资源,属于设计型仓库
Idea 与 Nexus 私服
- Maven settings.xml 文件中的配置
<servers>
<server>
<id>jim-release</id>
<username>admin</username>
<password>admin</password>
</server>
<server>
<id>jim-snapshots</id>
<username>admin</username>
<password>admin</password>
</server>
</servers>
<mirrors>
<mirror>
<id>jim</id>
<mirrorOf>*</mirrorOf>
<url>去 Nexus 私服仓库复制 </url>
</mirror>
</mirrors>
- 发布 【 maven deploy 】
<distributionManagement>
<repository>
<!-- settings.server 中的 ID -->
<id></id>
<url></url>
</repository>
</distributionManagement>
第八章 其他
settings.xml
<settings> <!-- 本地仓库地址 --> <localRepository>/Users/hsk/DevTools/mavenRepository</localRepository> <mirrors> <mirror> <!--次镜像唯一标识符,用来区分不同的 mirror 元素--> <id>nexus-aliyun</id> <!--对那种仓库进行镜像,简单来说就是代替那个仓库--> <mirrorOf>central</mirrorOf> <!--镜像名称--> <name>Nexus aliyun</name> <--镜像 url --> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> </mirror> </mirrors>
Maven 生命周期全过程
- validate 校验
- initialize 初始化
- generate-sources 生成源代码
- process-sources 处理源代码
- generate-resources 生成资源文件
- process-resources 处理资源文件
- compile 编译
- process-classes 处理类文件
- generate-test-sources 处理测试源代码
- process-test-sources 生成测试源代码
- generate-test-resources 生成测试资源文件
- process-test-resources 处理测试资源文件
- test-compile 编译测试源码
- process-test-classes 处理测试类文件
- test 测试
- prepare-package 准备打包
- package 打包
- pre-integration-test 集成测试前
- integration-test 集成测试
- post-integration-test 集成测试后
- verify 验证
- install 安装
- deploy 部署