秒懂Maven
- maven简介
- maven安装和配置
- maven本地配置
- maven工程的GAVP
- 创建maven工程
- 项目结构说明
- 项目构建说明
- Maven依赖管理
- 核心信息配置
- 依赖管理配置
- 依赖信息查询
- 依赖范围设置
- 依赖属性配置
- 依赖下载失败错误解决
- Build构建配置
- 依赖传递
- 依赖冲突
- maven工程继承
- 继承作用
- 应用场景
- 继承语法
- 父工程依赖统一管理
- maven工程聚合
- 聚合作用
- 聚合语法
- maven私服
- 私服的优势
- Nexus下载安装
- 初始设置
- 仓库介绍
- 配置Nexus下载jar包
- 部署jar包到Nexus
- 引用部署后jar包
maven简介
Maven 是一款为 Java 项目管理构建、依赖管理的工具(软件),使用 Maven 可以自动化构建、测试、打包和发布项目,大大提高了开发效率和质量
-
依赖管理:
Maven 可以管理项目的依赖,包括自动下载所需依赖库、自动下载依赖需要的依赖并且保证版本没有冲突、依赖版本管理等。通过 Maven,我们可以方便地维护项目所依赖的外部库,避免版本冲突和转换错误等,而我们仅仅需要编写配置即可 -
构建管理:
项目构建是指将源代码、配置文件、资源文件等转化为能够运行或部署的应用程序或库的过程,Maven 可以管理项目的编译、测试、打包、部署等构建过程
maven安装和配置
工具 | 版本 |
---|---|
Maven | 3.8.4 |
JDK | 8 |
-
下载地址
Apache Maven 官网地址
-
安装java环境
maven需要本机安装java环境、必需包含JAVA_HOME环境变量,如何安装就不多说了 -
下载之后解压即可
bin: 含有Maven的运行脚本
boot:含有plexus-classworlds类加载器框架
conf:含有Maven的核心配置文件
lib: 含有Maven运行时所需要的Java类库
LICENSE、NOTICE、README.txt:针对Maven版本,第三方软件等简要介绍 -
配置MAVEN_HOME、Path
查看安装是否成功
-
配置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> --> <!-- 配置本地maven仓库 50行附近--> <localRepository>C:\maven\maven-respository</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>
- 配置jdk版本项目构建
<!--在profiles节点(标签)下添加jdk编译版本 268行附近--> <profile><id>jdk-1.8</id><activation><activeByDefault>true</activeByDefault><jdk>1.8</jdk></activation><properties><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion></properties> </profile>
- 配置本地仓库地址
maven本地配置
打开idea,点击路径如下:
File -> Settings -> Bild, Execution, Deployment -> Build Tool -> Maven
修改如下:
maven工程的GAVP
- GroupID:com.{公司 }.业务线.[子业务线],最多 4 级
- ArtifactID:产品线名-模块名
- Version:版本号格式:主版本号.次版本号.修订号
- 主版本号:当做了不兼容的 API 修改,或者增加了能改变产品方向的新功能
- 次版本号:当做了向下兼容的功能性新增(新增类、接口等)
- 修订号:修复 bug
- Packaging:指示将项目打包成什么类型的文件,idea根据packaging值,识别maven项目类型
创建maven工程
File -> New -> Module
创建之后,maven会自动下载插件,创建好项目结构,生成pom文件
项目结构说明
|-- 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.xml:Maven 项目管理文件,用于描述项目的依赖和构建配置等信息
- src/main/java:存放项目的 Java 源代码。
- src/main/resources:存放项目的资源文件,如配置文件、静态资源等。
- src/main/webapp/WEB-INF:存放 Web 应用的配置文件。
- src/main/webapp/index.jsp:Web 应用的入口页面。
- src/test/java:存放项目的测试代码。
- src/test/resources:存放测试相关的资源文件,如测试配置文件等。
项目构建说明
命令 | 描述 |
---|---|
compile | 编译项目,生成target文件 |
package | 打包项目,生成jar或war文件 |
clean | 清理编译或打包后的项目结构 |
install | 打包后上传到maven本地仓库 |
deploy | 只打包,上传到maven私服仓库 |
test | 执行测试源码 |
Maven依赖管理
我们通过定义 POM 文件,Maven 能够自动解析项目的依赖关系,并通过 Maven 仓库自动下载和管理依赖,从而避免了手动下载和管理依赖的繁琐工作和可能引发的版本冲突问题
核心信息配置
<!-- 公司或者组织的唯一标志,并且配置时生成的路径也是由此生成-->
<groupId>com.companyname.project-group</groupId><!-- 项目的唯一ID,一个groupId下面可能多个项目,就是靠artifactId来区分的 -->
<artifactId>project</artifactId><!-- 版本号 -->
<version>1.0.0</version><!--打包方式默认:jarjar指的是普通的java项目打包方式war指的是web项目打包方式pom指的是这个项目作为父工程,被其他工程聚合或者继承
-->
<packaging>jar/pom/war</packaging>
依赖管理配置
<!-- 通过编写依赖jar包的gav必要属性,引入第三方依赖!scope属性是可选的,可以指定依赖生效范围!-->
<dependencies><!-- 引入具体的依赖包 --><dependency><!-- g --><groupId>log4j</groupId><!-- a --><artifactId>log4j</artifactId><!-- v --><version>1.2.17</version><!-- 依赖范围 --><scope>runtime</scope></dependency></dependencies>
依赖信息查询
- maven仓库信息官网 https://mvnrepository.com/
依赖范围设置
依赖范围 | 描述 |
---|---|
compile | 编译依赖范围。scope 元素的缺省值。依赖范围编译、测试、运行过程都是必须的 |
test | 测试依赖范围。依赖范围只对测试有效 |
provided | 已提供依赖范围。依赖范围只对编译有效 |
runtime | 运行依赖范围。依赖范围的只对测试、运行有效 |
system | 系统依赖范围。其效果与 provided 的依赖范围一致。用于添加非 Maven 仓库的本地依赖,通过依赖元素 dependency 中的 systemPath 元素指定本地依赖的路径。鉴于使用其会导致项目的可移植性降低,一般不推荐使用 |
import | 导入依赖范围。该依赖范围只能与 dependencyManagement 元素配合使用,其功能是将目标 pom.xml 文件中 dependencyManagement 的配置导入合并到当前 pom.xml 的 dependencyManagement 中。 |
依赖属性配置
<properties><!-- 通过编写properties添加自定义属性--><!-- 设置JDK版本 --><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><!-- 设置编码格式 --><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><!--自定义属性,在添加依赖时可以通过${package.version}来调用 --><package.version>4.12</package.version></properties>
依赖下载失败错误解决
下载错误原因
- 下载依赖时出现网络故障或仓库服务器宕机等原因,导致无法连接至 Maven 仓库,从而无法下载依赖。
- 依赖项的版本号或配置文件中的版本号错误,或者依赖项没有正确定义,导致 Maven 下载的依赖项与实际需要的不一致,从而引发错误。
- 本地 Maven 仓库或缓存被污染或损坏,导致 Maven 无法正确地使用现有的依赖项。
解决方案
- 检查网络连接和 Maven 仓库服务器状态。
- 确保依赖项的版本号与项目对应的版本号匹配,并检查 POM 文件中的依赖项是否正确。
- 清除本地 Maven 仓库缓存(lastUpdated 文件),因为只要存在lastupdated缓存文件,刷新也不会重新下载。在本地仓库中,根据依赖的gav属性依次向下查找文件夹,最终删除内部的文件,刷新重新下载即可
Build构建配置
构建不需要额外配置,都有对应的缺省配置。但我们也可以在pom.xml使用build标签来定制一些配置,修改默认值
指定打包命名
<!-- 默认的打包名称:artifactid+verson.打包方式 -->
<build><finalName>定义打包名称</finalName>
</build>
指定打包文件
- 举例:
- java文件夹中添加xml文件,默认不会被打包,如何解决
<build><!--设置要打包的资源位置--><resources><resource><!--设置资源所在目录--><directory>src/main/java</directory><includes><!--设置包含的资源类型--><include>**/*.xml</include></includes></resource></resources>
</build>
配置依赖插件
dependencies标签下引入开发需要的jar包!我们可以在build/plugins/plugin标签引入插件
<build><plugins><!-- java编译插件,配jdk的编译版本 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration></plugin><!-- tomcat插件 --><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version><configuration><port>8090</port><path>/</path><uriEncoding>UTF-8</uriEncoding><server>tomcat7</server></configuration></plugin></plugins>
</build>
依赖传递
假如有Maven项目A,项目B依赖A,项目C依赖B。那么我们可以说 C依赖A。也就是说,依赖的关系为:C—>B—>A, 那么我们执行项目C时,会自动把B、A都下载导入到C项目的jar包文件夹中,这就是依赖的传递性
作用
- 简化依赖导入过程
- 确保依赖版本正确
依赖传递终止
- 非compile范围进行依赖传递
- 使用optional配置终止传递
- 依赖冲突(传递的依赖已经存在)
<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.15</version><!-- 终止传递 --><optional>true</optional>
</dependency>
依赖冲突
当直接引用或者间接引用出现了相同的jar包时,一个项目就会出现重复的jar包,这就算作冲突
解决依赖冲突方式:
- 自动选择原则
- 短路优先原则(第一原则)
- 谁的依赖路径最短,优先选择谁
- 依赖路径长度相同情况下,则“先声明优先”(第二原则)
- 在<depencies></depencies>中,先声明的,路径相同,会优先选择
- 短路优先原则(第一原则)
- 手动排除
<dependency><groupId>com.atguigu.maven</groupId><artifactId>pro01-maven-java</artifactId><version>1.0-SNAPSHOT</version><scope>compile</scope><!-- 使用excludes标签配置依赖的排除 --><exclusions><!-- 在exclude标签中配置一个具体的排除 --><exclusion><!-- 指定要排除的依赖的坐标(不需要写version) --><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId></exclusion></exclusions></dependency>
maven工程继承
Maven 继承是指在 Maven 的项目中,让一个项目从另一个项目中继承配置信息的机制。继承可以让我们在多个项目中共享同一配置信息,简化项目的管理和维护工作
继承作用
- 在父工程中统一管理项目中的依赖信息
应用场景
- 对一个比较大型的项目进行了模块拆分。
- 一个 project 下面,创建了很多个 module。
- 每一个 module 都需要配置自己的依赖信息。
继承语法
- 父工程
<!-- 父工程的坐标 --><groupId>com.xty.maven</groupId><artifactId>maven-parent</artifactId><version>1.0-SNAPSHOT</version><!-- 当前工程作为父工程,它要去管理子工程,所以打包方式必须是 pom --><packaging>pom</packaging>
- 子工程
<!-- 使用parent标签指定当前工程的父工程 --><parent><!-- 父工程的坐标 --><groupId>com.xty.maven</groupId><artifactId>maven-parent</artifactId><version>1.0-SNAPSHOT</version></parent><!-- 子工程的坐标 --><!-- 子工程坐标中的groupId和version与父工程一致,可以省略 --><artifactId>maven-son</artifactId>
父工程依赖统一管理
- 父工程声明版本
<!-- 使用dependencyManagement标签配置对依赖的管理 --><!-- 被管理的依赖并没有真正被引入到工程 --><dependencyManagement><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>6.0.10</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>6.0.10</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>6.0.10</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId><version>6.0.10</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>6.0.10</version></dependency></dependencies></dependencyManagement>
- 子工程引用版本
<!-- 子工程引用父工程中的依赖信息时,可以把版本号去掉。 --><!-- 把版本号去掉就表示子工程中这个依赖的版本由父工程决定。 --><!-- 具体来说是由父工程的dependencyManagement来决定。 --><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId></dependency></dependencies>
maven工程聚合
Maven 聚合是指将多个项目组织到一个父级项目中,以便一起构建和管理的机制。聚合可以帮助我们更好地管理一组相关的子项目,同时简化它们的构建和部署过程
聚合作用
- 管理多个子项目:通过聚合,可以将多个子项目组织在一起,方便管理和维护。
- 构建和发布一组相关的项目:通过聚合,可以在一个命令中构建和发布多个相关的项目,简化了部署和维护工作。
- 优化构建顺序:通过聚合,可以对多个项目进行顺序控制,避免出现构建依赖混乱导致构建失败的情况。
- 统一管理依赖项:通过聚合,可以在父项目中管理公共依赖项和插件,避免重复定义。
聚合语法
<project><groupId>com.example</groupId><artifactId>parent-project</artifactId><packaging>pom</packaging><version>1.0.0</version><!-- 父项目中包含的子项目列表 --><!-- module里写的是项目的路径 --><modules><module>child1-path</module><module>child2-path</module></modules></project>
maven私服
Maven 私服是一种特殊的Maven远程仓库,它是架设在局域网内的仓库服务,用来代理位于外部的远程仓库(中央仓库、其他远程公共仓库)
私服的优势
-
节省外网带宽
消除对外部远程仓库的大量重复请求,降低外网带宽压力。 -
下载速度更快
Maven私服位于局域网内,从私服下载构建更快更稳定。 -
便于部署第三方构件
有些构件无法从任何一个远程仓库中获得,建立私服之后,就可以将这些构件部署到私服中,供内部Maven项目使用。 -
提高项目的稳定性,增强对项目的控制
如果不建立私服,那么Maven项目的构件就高度依赖外部的远程仓库,若外部网络不稳定,则项目的构建过程也会变得不稳定。建立私服后,即使外部网络状况不佳甚至中断,只要私服中已经缓存了所需的构件,Maven也能够正常运行。 -
降低中央仓库得负荷压力
由于私服会缓存中央仓库得构件,避免了很多对中央仓库的重复下载,降低了中央仓库的负荷
常见的Maven私服产品
- Apache的Archiva
- JFrog的Artifactory
- Sonatype的Nexus([ˈneksəs])
Nexus下载安装
- Nexus下载地址
Nexus安装解压即可,进入bin目录下,执行./nexus /run命令启动
首页地址:http://localhost:8081/,8081为默认端口号
初始设置
- 用户名:admin
- 密码:查看Nexus解压后的admin.password文件
用匿名登录
初始化完成
仓库介绍
仓库类型 | 说明 |
---|---|
proxy | 某个远程仓库的代理 |
group | 存放:通过 Nexus 获取的第三方 jar 包 |
hosted | 存放:本团队其他开发人员部署到 Nexus 的 jar 包 |
仓库名称 | 说明 |
---|---|
maven-central | Nexus 对 Maven 中央仓库的代理 |
maven-public | Nexus 默认创建,供开发人员下载使用的组仓库 |
maven-releases | Nexus 默认创建,供开发人员部署自己 jar 包的宿主仓库 要求 releases 版本 |
maven-snapshots | Nexus 默认创建,供开发人员部署自己 jar 包的宿主仓库 要求 snapshots 版本 |
配置Nexus下载jar包
1.修改本地maven的核心配置文件settings.xml,设置新的本地仓库地址
<!-- 配置一个新的 Maven 本地仓库 -->
<localRepository>D:/maven-repository-new</localRepository>
- 在servers标签下配置id、用户名、密码
<server><!-- nexus-id是自己设置的 --><id>nexus-id</id><username>user</username><password>password</password>
</server>
- 配置新的mirror标签
<mirror><id>nexus-id</id><mirrorOf>central</mirrorOf><name>Nexus mine</name><!-- url就是仓库的URL,点击copy复制 --><url>http://localhost:8081/repository/maven-public/</url>
</mirror>
注意:server 标签内的 id 标签值必须和 mirror 标签中的 id 值一样
部署jar包到Nexus
maven工程中配置如下,执行deploy命令上传
<distributionManagement><snapshotRepository><id>nexus-id</id><name>Nexus Snapshot</name><url>http://localhost:8081/repository/maven-snapshots/</url></snapshotRepository>
</distributionManagement>
注意:这里 snapshotRepository 的 id 标签必须和 settings.xml 中指定的 mirror 标签的 id 属性一致
引用部署后jar包
maven工程中配置:
<repositories><repository><id>nexus-id</id><name>nexus-mine</name><url>http://localhost:8081/repository/maven-snapshots/</url><snapshots><enabled>true</enabled></snapshots><releases><enabled>true</enabled></releases></repository>
</repositories>