Maven
- Maven是专门用来管理和构建Java项目的工具,主要功能:
- 提供了一套标准化的项目结构
- 提供了一套标准化的构建流程(编译,测试,打包,发布...)
- 提供了一套依赖管理机制
1. Maven基础
1. Maven的常用命令
- compile: 编译
- clean: 清理
- test: 测试
- package: 打包
- install: 安装
2. Maven的生命周期
- Maven构建项目生命周期描述的是一次构建过程经历了多少事件
- Maven对项目构建的生命周期划分为3套
- clean: 清理工作
- default: 核心工作(编译,测试,打包,安装等)
- site: 产生报告,发布站点等
3. Maven的坐标
-
指的是资源的唯一标识
-
使用坐标来定义项目或引入项目中需要的依赖
-
Maven的坐标主要组成‘
- groupid:定义当前Maven项目隶属组织名称(通常是域名反写,例如:com.sky)
- artifactId:定义当前Maven项目名称(通常是模块名称)
- version:定义当前项目版本号
4. 使用坐标导入jar包
- 在pom.xml中编写标签
- 在标签中使用引入坐标
- 定义坐标的groupId, artifactId, version
- 点击刷新按钮使坐标生效
5. 依赖范围
- 通过设置坐标的依赖范围(scope),可以设置对应jar包的作用范围:编译环境,测试环境,运行环境
| 依赖范围 | 编译classpath | 测试classpath | 运行classpath | 例子 |
|---|---|---|---|---|
| compile | Y | Y | Y | logback |
| test | - | Y | - | Junit |
| provided | Y | Y | - | servlet-api |
| runtime | - | Y | Y | jdbc驱动 |
| system | Y | Y | - | 存储在本地的jar包 |
| import | 引入DependencyManagement | 引入DependencyManagement | 引入DependencyManagement |
2. Maven高级
1. 分模块开发和设计
-
分模块开发:将原始模块按照功能拆分成若干个子模块,方便模块间的相互调用,接口共享
-
步骤
- 创建Maven模块
- 书写模块代码
- 通过Maven指令安装模块到本地仓库(install对应新的模块)
2. 依赖管理
-
依赖传递
依赖具有传递性
- 直接依赖:当前项目中通过依赖配置(dependency)建立的依赖关系
- 间接依赖:被依赖的资源如果依赖其他资源,当前项目间接依赖其他资源
依赖传递冲突问题
- 路径优先:当依赖中出现相同的资源时,层级原神,优先级越低,层级越浅,优先级越高
- 声明优先:当资源在相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的
3. 可选依赖和排除依赖
-
可选依赖是隐藏当前工程所依赖的资源,隐藏后对应资源将不具有依赖传递(控制别人能不能看见我用的依赖)【不透明】
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.0-SNAPSHOT</version> <!--可选依赖是隐藏当前工程所依赖的资源,隐藏后对应资源将不具有依赖传递 --> <optional>false</optional> </dependency> -
排除依赖是隐藏当前资源对应的依赖关系(用别人的依赖可以剔除其中的依赖)【不需要】
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.0-SNAPSHOT</version> <!--排除依赖是隐藏当前资源对应的依赖关系 --> <exclusions> <exclusion> <groupId>123</groupId> <artifactId>123</artifactId> </exclusion> </exclusions> </dependency>
4. 继承和聚合
1. 聚合
-
聚合:将多个模块组织成一个整体,同时进行项目构建的过程叫做聚合
-
聚合工程:通常是一个不具有业务功能的“空”工程(有且只有一个pom文件)
-
作用:使用聚合工程可以将多个工程编组,通过对聚合工程进行构建,实现对所包含的模块进行同步构建
-
解决批量模块同步更新的问题
-
-
聚合工程开发步骤
-
创建maven模块,设置打包类型为pom
<packaging>pom</packaging> -
设置当前聚合工程所包含子模块的名称
<modules> <module>user-service</module> <module>order-service</module> <module>eureka-server</module> <module>feign-api</module> <module>gateway</module> </modules>
-
2. 继承
-
作用:
- 简化配置(只需在父工程中进行依赖配置)
- 减少版本冲突(在父工程中的dependencyManagement下配置的依赖,子工程可以选择是否进行配置)
<dependencyManagement> <dependencies> <!-- springCloud --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencyManagement>
5. 属性
-
定义属性
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring-cloud.version>Hoxton.SR10</spring-cloud.version> <mysql.version>5.1.47</mysql.version> <mybatis.version>2.1.1</mybatis.version> </properties> -
引用属性
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <!--${spring-cloud.version} --> <type>pom</type> <scope>import</scope> </dependency>
- 版本管理
- 工程版本:
- SNAPSHOT(快照版本)
- 项目开发过程中临时输出的版本,成为快照版本
- 快照版本会随着开发的进展不断更新
- RELEASE(发布版本)
- 项目开发到进入阶段里程碑后,向团队外部发布较为稳定的版本,这种版本所对应的构件文件是稳定的,即便进行功能的后续开发,也不会改变当前发布版本内容,这种版本成为发布版本
- SNAPSHOT(快照版本)
- 工程版本:
6. 多环境配置与应用
-
定义多环境
<profiles> <profile> <id>dev</id> <!--设置默认启动 --> <activation> <activeByDefault>true</activeByDefault> </activation> </profile> </profiles> -
使用多环境
mvn install -p dev
-
跳过测试
- 应用场景
- 功能更新中并且没开发完毕
- 快速打包
mvn install -D skipTests-
使用插件细粒度控制跳过测试
<plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.2</version> <configuration> <skipTests>false</skipTests> <!-- 跳过不参与测试的内容--> <excludes> **/BookService.java </excludes> </configuration> </plugin> </plugins>
- 应用场景