Maven简介
Maven 是一款为 Java 项目构建管理、依赖管理的工具
- Maven可以管理项目的依赖,包括自动下载所需依赖库、自动下载依赖需要的依赖并且保证版本没有冲突
- Maven 可以管理项目的编译、测试、打包、部署等构建过程。通过实现标准的构建生命周期
Maven配置
- 修改maven/conf/settings.xml
<!-- localRepository | The path to the local repository maven will use to store artifacts. | | Default: ${user.home}/.m2/repository <localRepository>/path/to/local/repo</localRepository> --> <!-- conf/settings.xml 55行 --> <localRepository>D:\repository</localRepository>
- 配置国内阿里镜像
<!--在mirrors节点(标签)下添加中央仓库镜像 160行附近--> <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror>
- idea配置本地maven:构建工具配置file / settings / build / build tool / maven
Maven工程
1.GAVP属性
GroupID 格式:com.{公司/BU }.业务线.[子业务线],最多 4 级。
- 说明:{公司/BU} 例如:alibaba/taobao/tmall/aliexpress 等 BU 一级;子业务线可选。
- 正例:com.taobao.tddl 或 com.alibaba.sourcing.multilang com.atguigu.java
- ArtifactID 格式:产品线名-模块名
Version版本号格式推荐:主版本号.次版本号.修订号 1.0.0
- 主版本号:当做了不兼容的 API 修改,或者增加了能改变产品方向的新功能。
- 次版本号:当做了向下兼容的功能性新增(新增类、接口等)。
- 修订号:修复 bug,没有修改方法签名的功能加强,保持 API 兼容性。
- 例如: 初始→1.0.0 修改bug → 1.0.1 功能调整 → 1.1.1等
Packaging定义规则:指示将项目打包为什么类型的文件,idea根据packaging值,识别maven项目类型!
- packaging 属性为 jar(不写为默认值jar),代表普通的Java工程,打包以后是.jar结尾的文件。
- packaging 属性为 war,代表Java的web工程,打包以后.war结尾的文件。
- packaging 属性为 pom,代表不会打包,用来做继承的父工程。
2.Maven工程项目结构
|-- pom.xml # Maven 项目管理文件
|-- src
|-- main # 项目主要代码
| |-- java # Java 源代码目录
| | `-- com/example/myapp # 开发者代码主目录
| | |-- controller # 存放 Controller 层代码的目录
| | |-- service # 存放 Service 层代码的目录
| | |-- dao # 存放 DAO 层代码的目录
| | `-- model # 存放数据模型的目录
| |-- resources # 资源目录,存放配置文件、静态资源等
| | |-- log4j.properties # 日志配置文件
| | |-- spring-mybatis.xml # Spring Mybatis 配置文件
| | `-- static # 存放静态资源的目录
| | |-- css # 存放 CSS 文件的目录
| | |-- js # 存放 JavaScript 文件的目录
| | `-- images # 存放图片资源的目录
| `-- webapp # 存放 WEB 相关配置和资源
| |-- WEB-INF # 存放 WEB 应用配置文件
| | |-- web.xml # Web 应用的部署描述文件
| | `-- classes # 存放编译后的 class 文件
| `-- index.html # Web 应用入口页面
`-- test # 项目测试代码
|-- java # 单元测试目录
`-- resources # 测试资源目录
Maven核心功能
1.依赖管理和添加
<!--
通过编写依赖jar包的gav必要属性,引入第三方依赖!
scope属性是可选的,可以指定依赖生效范围!
依赖信息查询方式:
1. maven仓库信息官网 https://mvnrepository.com/
2. mavensearch插件搜索
-->
<dependencies>
<!-- 引入具体的依赖包 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
<!--
生效范围
- compile :main目录 test目录 打包打包 [默认]
- provided:main目录 test目录 Servlet(tomcat中包含)
- runtime: 打包运行 MySQL反射时
- test: test目录下生效 junit单元测试
-->
<scope>runtime</scope>
</dependency>
</dependencies>
将版本号提取出来统一管理:
<!--声明版本-->
<properties>
<!--命名随便,内部制定版本号即可!-->
<junit.version>4.11</junit.version>
<!-- 也可以通过 maven规定的固定的key,配置maven的参数!如下配置编码格式!-->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<!--引用properties声明版本 -->
<version>${junit.version}</version>参数替换
</dependency>
</dependencies>
2.依赖传递和冲突
依赖传递:Maven会自动解析和加载其所有的直接和间接依赖,确保这些依赖都可用。通过依赖传递的依赖,之间都不会存在版本兼容性问题。
依赖冲突:冲突路径短的包优先选择(未选择的包后续依赖都不会被引入),路径相同的按照声明顺序
3.构建管理
命令需要进入pom.xml同级文件夹下
命令 | 描述 |
---|---|
mvn clean | 清理编译或打包后的项目结构,删除target文件夹 |
mvn compile | 编译项目,生成target文件 |
mvn test | 执行测试源码 (测试) |
mvn site | 生成一个项目依赖信息的展示页面 |
mvn package | 打包项目,生成war / jar 文件 |
mvn install | 打包后上传到maven本地仓库(本地部署) |
mvn deploy | 只打包,上传到maven私服仓库(私服部署) |
构建命令周期:触发周期后的命令,会自动触发周期前的命令
打包: mvn clean package
重新编译: mvn clean compile
本地部署: mvn clean install
maven插件配置:
<build>
<!-- jdk17 和 war包版本插件不匹配 -->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
</plugins>
</build>
Maven继承和聚合特性
1.继承作用
在父工程中统一管理项目中的依赖信息,进行统一版本管理
2.继承语法
当前工程作为父工程,它要去管理子工程,所以打包方式必须是 pom
父工程
<groupId>com.atguigu.maven</groupId>
<artifactId>pro03-maven-parent</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
子工程gav标签写法:
<parent>
<groupId>com.atguigu</groupId>
<artifactId>micro-shop</artifactId>
<version>1.0.1</version>
</parent>
<artifactId>user-service</artifactId>
<packaging>war</packaging>
父工程依赖进行统一管理,声明版本,并没有真正被引入工程
<!-- 使用dependencyManagement标签配置对依赖的管理 -->
<!-- 被管理的依赖并没有真正被引入到工程 -->
<dependencyManagement>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
</dependencies>
</dependencyManagement>
子工程引用版本
<!-- 子工程引用父工程中的依赖信息时,可以把版本号去掉。 -->
<!-- 把版本号去掉就表示子工程中这个依赖的版本由父工程决定。 -->
<!-- 具体来说是由父工程的dependencyManagement来决定。 -->
<!-- 当子工程指定版本号时,以子工程版本为准 -->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
</dependency>
</dependencies>
3.聚合概念
Maven 聚合是指将多个项目组织到一个父级项目中,通过触发父工程的构建,统一按顺序触发子工程构建的过程
- 统一管理子项目构建:通过聚合,可以将多个子项目组织在一起,方便管理和维护。
- 优化构建顺序:通过聚合,可以对多个项目进行顺序控制,避免出现构建依赖混乱导致构建失败的情况。
聚合语法:在父工程中的pom文件中:
<project>
<modules>
<module>child-project1</module>
<module>child-project2</module>
</modules>
</project>