Maven 文档
Maven 是一款为 Java 项目构建管理、依赖管理的工具(软件),使用 Maven 可以自动化构建、测试、打包和发布项目,大大提高了开发效率和质量。
依赖管理工具
maven下载版本
MAVEN_HOME
D:\Environment\apache-maven-3.6.3
%MAVEN_HOME%\bin
<mirror>
<id>alimavenid>
<name>aliyun mavenname>
<url>http://maven.aliyun.com/nexus/content/groups/public/url>
<mirrorOf>centralmirrorOf>
mirror>
<profile>
<id>jdk-17id>
<activation>
<activeByDefault>trueactiveByDefault>
<jdk>17jdk>
activation>
<properties>
<maven.compiler.source>17maven.compiler.source>
<maven.compiler.target>17maven.compiler.target>
<maven.compiler.compilerVersion>17maven.compiler.compilerVersion>
properties>
profile>
Maven工程相对之前的工程,多出一组gavp属性,gav需要我们在创建项目的时指定,p有默认值,后期通过配置文件修改。
Maven 中的 GAVP 是指 GroupId、ArtifactId、Version、Packaging 等四个属性的缩写,其中前三个是必要的,而 Packaging 属性为可选项。
GAV遵循一下规则:
1) GroupID 格式:com.{公司/BU }.业务线.[子业务线],最多 4 级。
说明:{公司/BU} 例如:alibaba/taobao/tmall/aliexpress 等 BU 一级;子业务线可选。
正例:com.taobao.tddl 或 com.alibaba.sourcing.multilang com.atguigu.java
2) ArtifactID 格式:产品线名-模块名。语义不重复不遗漏,先到仓库中心去查证一下。
正例:tc-client / uic-api / tair-tool / bookstore
3) Version版本号格式推荐:主版本号.次版本号.修订号 1.0.0
1) 主版本号:当做了不兼容的 API 修改,或者增加了能改变产品方向的新功能。
2) 次版本号:当做了向下兼容的功能性新增(新增类、接口等)。
3) 修订号:修复 bug,没有修改方法签名的功能加强,保持 API 兼容性。
例如: 初始→1.0.0 修改bug → 1.0.1 功能调整 → 1.1.1等
Packaging定义规则:
指示将项目打包为什么类型的文件,idea根据packaging值,识别maven项目类型!
packaging 属性为 jar(默认值),代表普通的Java工程,打包以后是.jar结尾的文件。
packaging 属性为 war,代表Java的web工程,打包以后.war结尾的文件。
packaging 属性为 pom,代表不会打包,用来做继承的父工程。
注意:此处省略了version,直接给了一个默认值
|-- 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 # 测试资源目录
- 通过定义 POM 文件,Maven 能够自动解析项目的依赖关系,
- 并通过 Maven 仓库自动下载和管理依赖,
- 从而避免了手动下载和管理依赖的繁琐工作和可能引发的版本冲突问题。
编写pom.xml文件
<modelVersion>4.0.0modelVersion>
<groupId>com.companyname.project-groupgroupId>
<artifactId>projectartifactId>
<version>1.0.0version>
<packaging>jar/pom/warpackaging>
<dependencies>
<dependency>
<groupId>log4jgroupId>
<artifactId>log4jartifactId>
<version>1.2.17version>
<scope>runtimescope>
dependency>
dependencies>
<properties>
<junit.version>4.11junit.version>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>
properties>
<dependencies>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>${junit.version}version>
dependency>
dependencies>
依赖传递 : 导入依赖,会自动导入依赖的依赖(compile dependenices)
简化依赖的导入 确保依赖的版本无冲突
依赖冲突: 发现已存在依赖(重复依赖)会终止依赖传递!避免循环依赖和重复依赖的问题!
依赖冲突的发生场景:重复依赖!
解决原则:
- 引用路径长度 更短
- 在上面的优先 dependencies声明的先后顺序
可能会发生依赖项下载错误的情况,主要原因有以下几种:
解决方案:
@echo off
rem 这里写你的仓库路径
set REPOSITORY_PATH=D:\Environment\openrepository
rem 正在搜索...
for /f "delims=" %%i in ('dir /b /s "%REPOSITORY_PATH%\*lastUpdated*"') do (
del /s /q %%i
)
rem 搜索完毕
pause
使用记事本打开
set REPOSITORY_PATH=D:\repository 改成你本地仓库地址即可!
点击运行脚本,即可自动清理本地错误缓存文件!!
项目构建是指将源代码、依赖库和资源文件等转换成可执行或可部署的应用程序的过程,在这个过程中包括编译源代码、链接依赖库、打包和部署等多个步骤。
主动触发场景:
语法: mvn 构建命令 构建命令…
命令 | 描述 |
---|---|
mvn clean | 清理编译或打包后的项目结构,删除target文件夹 |
mvn compile | 编译项目,生成target文件 |
mvn test | 执行测试源码 (测试) |
mvn site | 生成一个项目依赖信息的展示页面 |
mvn package | 打包项目,生成war / jar 文件 |
mvn install | 打包后上传到maven本地仓库(本地部署) |
mvn deploy | 只打包,上传到maven私服仓库(私服部署) |
构建生命周期可以理解成是一组固定构建命令的有序集合,触发周期后的命令,会自动触发周期前的命令!也是一种简化构建的思路!
清理周期:主要是对项目编译生成文件进行清理
包含命令:clean
默认周期:定义了真正构件时所需要执行的所有步骤,它是生命周期中最核心的部分
包含命令:compile - test - package - install / deploy
报告周期
包含命令:site
打包: mvn clean package 本地仓库: mvn clean install
最佳使用方案:
打包: mvn clean package
重新编译: mvn clean compile
本地部署: mvn clean install
周期,命令和插件:
周期→包含若干命令→包含若干插件!
使用周期命令构建,简化构建过程!
最终进行构建的是插件!
插件配置:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-war-pluginartifactId>
<version>3.2.2version>
plugin>
plugins>
build>
Maven 继承是指在 Maven 的项目中,让一个项目从另一个项目中继承配置信息的机制。
多个项目中共享同一配置信息,简化项目的管理和维护工作。
作用:在父工程中统一管理项目中的依赖信息,进行统一版本管理!
背景:
需求:
继承语法:
<groupId>com.doug.mavengroupId>
<artifactId>pro03-maven-parentartifactId>
<version>1.0-SNAPSHOTversion>
<packaging>pompackaging>
<parent>
<groupId>com.doug.mavengroupId>
<artifactId>pro03-maven-parentartifactId>
<version>1.0-SNAPSHOTversion>
parent>
<artifactId>pro04-maven-moduleartifactId>
父工程依赖统一管理:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-coreartifactId>
<version>4.0.0.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-beansartifactId>
<version>4.0.0.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-contextartifactId>
<version>4.0.0.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-expressionartifactId>
<version>4.0.0.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-aopartifactId>
<version>4.0.0.RELEASEversion>
dependency>
dependencies>
dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-coreartifactId>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-beansartifactId>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-contextartifactId>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-expressionartifactId>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-aopartifactId>
dependency>
dependencies>
Maven 聚合是指将多个项目组织到一个父级项目中,通过触发父工程的构建,统一按顺序触发子工程构建的过程!
聚合语法:
父项目中包含的子项目列表。
<project>
<groupId>com.examplegroupId>
<artifactId>parent-projectartifactId>
<packaging>pompackaging>
<version>1.0.0version>
<modules>
<module>child-project1module>
<module>child-project2module>
modules>
project>
需求案例:搭建一个电商平台项目,该平台包括用户服务、订单服务、通用工具模块等。
项目架构:
服务依赖:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<groupId>com.douggroupId>
<artifactId>micro-shopartifactId>
<version>1.0.1version>
<modules>
<module>user-servicemodule>
modules>
<packaging>pompackaging>
<properties>
<spring.version>6.0.6spring.version>
<jackson.version>2.15.0jackson.version>
<shiro.version>1.10.1shiro.version>
<commons.version>2.11.0commons.version>
<maven.compiler.source>17maven.compiler.source>
<maven.compiler.target>17maven.compiler.target>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-contextartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>com.fasterxml.jackson.coregroupId>
<artifactId>jackson-databindartifactId>
<version>${jackson.version}version>
dependency>
<dependency>
<groupId>org.apache.shirogroupId>
<artifactId>shiro-coreartifactId>
<version>${shiro.version}version>
dependency>
<dependency>
<groupId>commons-iogroupId>
<artifactId>commons-ioartifactId>
<version>${commons.version}version>
dependency>
dependencies>
dependencyManagement>
<dependencies>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-war-pluginartifactId>
<version>3.2.2version>
plugin>
plugins>
build>
project>
删除src 只留pom
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>micro-shopartifactId>
<groupId>com.douggroupId>
<version>1.0.1version>
parent>
<modelVersion>4.0.0modelVersion>
<artifactId>user-serviceartifactId>
<packaging>warpackaging>
<properties>
<maven.compiler.source>17maven.compiler.source>
<maven.compiler.target>17maven.compiler.target>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
properties>
<dependencies>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-contextartifactId>
dependency>
<dependency>
<groupId>com.fasterxml.jackson.coregroupId>
<artifactId>jackson-databindartifactId>
dependency>
dependencies>
project>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>micro-shopartifactId>
<groupId>com.douggroupId>
<version>1.0.1version>
parent>
<modelVersion>4.0.0modelVersion>
<artifactId>order-serviceartifactId>
<packaging>warpackaging>
<properties>
<maven.compiler.source>17maven.compiler.source>
<maven.compiler.target>17maven.compiler.target>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
properties>
<dependencies>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-contextartifactId>
dependency>
<dependency>
<groupId>org.apache.shirogroupId>
<artifactId>shiro-coreartifactId>
dependency>
dependencies>
project>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>micro-shopartifactId>
<groupId>com.douggroupId>
<version>1.0.1version>
parent>
<modelVersion>4.0.0modelVersion>
<artifactId>common-serviceartifactId>
<packaging>jarpackaging>
<properties>
<maven.compiler.source>17maven.compiler.source>
<maven.compiler.target>17maven.compiler.target>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
properties>
<dependencies>
<dependency>
<groupId>commons-iogroupId>
<artifactId>commons-ioartifactId>
dependency>
dependencies>
project>
install 需要的依赖模块 -> common-service
需要引用当前项目 下的 模块作为依赖 就得导出模块为jar , 再由要导入依赖的模块添加dependency
另外两个模块的pom添加模块依赖:
<dependency>
<groupId>com.douggroupId>
<artifactId>common-serviceartifactId>
dependency>
核心点 | 掌握目标 |
---|---|
安装 | maven安装、环境变量、maven配置文件修改 |
工程创建 | gavp属性理解、JavaSE/EE工程创建、项目结构 |
依赖管理 | 依赖添加、依赖传递、版本提取、导入依赖错误解决 |
构建管理 | 构建过程、构建场景、构建周期等 |
继承和聚合 | 理解继承和聚合作用、继承语法和实践、聚合语法和实践 |