maven基础
maven命令
| 命令 | 含义 |
|---|---|
| mvn clean | 清理已编译好的target目录下的文件(包含target本身) |
| mvn compile | 编译源代码 |
| mvn test | 执行项目中的单元测试用例 |
| mvn package | 根据项目<packing>标签类型打包成指定文件,默认jar |
| mvn install | 把打包好的文件安装在本地Repository仓库中 |
| mvn deploy | 把打包好的文件发布至maven私服 |
maven依赖管理
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
</dependency>
</dependencies>
<dependency>:标识引入组件
<groupId>:组件组织唯一标识,对应的一般是java的包结构
<artifactId>:组件唯一标识
<version>:组件版本
加载流程
maven会先去本地仓库查找是否存在如不存在则去上级查找(一般上级为企业私服),如私服不存在则再去配置的公网服务器(一般为了加载快速会在maven配置文件中指定不同的国内镜像源如图中所示阿里)中查找,如也不存在则直接去maven中央仓库查找

项目依赖
项目依赖是指maven通过依赖传播、依赖优先原则、可选依赖、排除依赖、依赖范围等特性来管理项目项目
依赖传播特性
在项目开发时,长长会用到第三方组件,而第三方组件在也会依赖其他组件,遇到这种第三方组件,maven会把该项目所需的所有组件都加载到本项目中
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>3.5.2</version>
</dependency>

如图所示,项目引用了mybatis-plus为直接依赖;而对mybatis依赖是通过mybatis-plus一来传递加载进来的为间接依赖
依赖优先原则
基于依赖传播特性,会导致整个项目的依赖网络错综复杂,会照成相同组件却出现不同版本的问题;maven遇到该问题时,会根据依赖优先原则选择某个版本。
第一原则:最短路径优先
<dependencies>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.11</version>
</dependency>
</dependencies>
如项目依赖A;但A组件和项目本身均依赖X组件;
其中mybatis-plus组件依赖mybatis组件路径为yulun-client-->mybatis-plus-->mybatis-plus-core-->mybatis(3.5.10)
yulun-client项目本身依赖X路径为yulun-client-->mybatis(3.5.11)
在路径上看,项目本身依赖路径最短,优先使用mybatis(3.5.11);

第二原则:第一声明优先
如项目依赖X和Y组件;但X和Y组件均依赖Z组件,但X(Z=1.0)和Y(Z=2.0)的组件依赖路径相同,但版本不同,则根据pom声明顺序进行加载,如X声明在Y之前则加载Z(2.0)版本。
第三原则:覆盖优先
子类pom内声明优先于父类pom,子类和父类都引入了mybatis-plus组件,子类为引入的为3.5.0版本,父类为3.5.2版本,在该情况下,子类覆盖父类,默认加载3.5.0版本
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>3.5.0</version>
</dependency>


可选依赖
可通过<optional>标签,表示该依赖非必须,在其他组件引用该组件时,被<optional>标签标识为true的组件不会被依赖。
<!-- 直接添加commons-logging -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
<optional>true</optional>
</dependency>
排除依赖
排除指定依赖,如A组件依赖了B组件,但无需使用,故此可直接声明在引用A组见时排除B组件
<!-- 直接添加commons-logging -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</exclusion>
</exclusions>
</dependency>
依赖范围
通过
| compile(默认) | 编译范围,编译和打包均会依赖 |
|---|---|
| provided | 提供范围,编译时依赖,但不会打包到项目中 |
| runtime | 运行是范围,打包时依赖,编译不会 |
| test | 测试范围,编译运行测试用例时加载 |
| system | 编译时依赖,不会打包到项目中 |
项目聚合
聚合
可将多个模块整合到一起,统一构建,面掉一个个构建;聚合需要一个父工程支撑,在父工程pom中添加<modules>进行整合
<modules>
<module>yulun-client</module>
<module>yulun-server</module>
</modules>
继承
子项目可直接继承父项目配置的属性、依赖、插件等配置,避免个个项目重复配置,同时继承的属性、依赖、插件等,子工程均可重写,重写后以子工程为准,参考依赖优先覆盖原则
依赖管理
因为继承特性,多个子工程可间接依赖父工程的依赖,针对于多个子工程依赖同一个组件时,可能会导致每个子工程以来的组件版本不同;这种情况下可通过父工程使用<dependencyManagement>标签进行统一定义版本,而后子工程只需引入组件,无需指定版本。
<!-- 父工程中声明 junit 4.12 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 子工程中引入 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
项目属性
在pom中可通过
<!-- 定义方式 -->
<properties>
<name>yulun</name>
</properties>
<!-- 引入方式 -->
${name}
maven默认属性
| 命令 | 含义 |
|---|---|
| ${basedir} | 项目根路径 |
| ${version} | 项目版本 |
| ${project.besedir} | 同项目根据路径 |
| ${project.verison} | 同项目版本 |
| ${project.bulid.directory} | 构建目录,默认值为target |
| ${project.build.sourceEncoding} | 主源码编译格式 |
| ${project.build.sourceDirectory} | 主源码路径 |
| ${project.build.finalName} | 输出文件名称 |
| ${project.build.outputDirectory} | 构建项目输出路径,默认值为target/classes |

浙公网安备 33010602011771号