依赖管理
依赖管理是项目管理中非常重要的一环。几乎任何项目开发的时候需要都需要使用到库。而这些库很可能又依赖别的库,这样整个项目的依赖形成了一个树状结构,而随着这个依赖的树的延伸和扩大,一系列问题就会随之产生。Maven提供了一套完整的方法,让使用者可以轻松的管理项目的依赖。
首先,查找第三方依赖,方式有:1. maven仓库信息官网 https://mvnrepository.com/搜索。2. mavensearch插件 ,在tools的maven-search搜索。然后只需将对应的依赖包<dependency>加入到我们pom文件的<dependencies>中即可。
如果第三方依赖过多,我们需要提取版本号,统一管理。在<properties>标签里进行声明,命名随便,推荐使用:技术名.version,然后就可以在其他的<dependency>中的version属性中通过${技术名.version}引用,我们只要在<properties>里改版本,其他用到该技术的依赖<dependency>都跟着变了。
可选属性scope,指定依赖生效范围/作用域:
<dependencies> <!-- 引入具体的依赖包 --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> <scope>runtime</scope> </dependency> </dependencies> ```
scope有以下几个值可以取compile(默认)、test、runtime、provided、system、import。compile在编译、运行、测试的时候都会导入依赖项。一般情况下是使用这个作用域。test只有在测试的时候会导入依赖项,比如juni库。如果一些依赖只有在测试的时候会用到,比如一些测试库,那么需要设置其作用域为test。runtime在编译时不会导入依赖项,运行的时候会导入依赖项。比如各种数据库驱动的jdbc实现库,编译的时候不会使用到这些库,但是运行的时候jdbc会动态加载会用到这些库。provided作用域在编译和测试的时候会引入依赖,但是运行时不会。有些库有运行环境提供,为了避免和运行环境已有库冲突需要设置作用域为provided。比如java web中的servlet库,tomcat容器自带这个库,所以编写web项目的时候需要声明servlet依赖的作用域为provided。
依赖传递与冲突:
依赖发生冲突,后续的依赖传递全部终止
在使用 Maven 构建项目时,可能会发生依赖项下载错误的情况,主要原因有以下几种:
1. 下载依赖时出现网络故障或仓库服务器宕机等原因,导致无法连接至 Maven 仓库,从而无法下载依赖。
2. 依赖项的版本号或配置文件中的版本号错误,或者依赖项没有正确定义,导致 Maven 下载的依赖项与实际需要的不一致,从而引发错误。
3. 本地 Maven 仓库或缓存被污染或损坏,导致 Maven 无法正确地使用现有的依赖项,并且也无法重新下载!
解决方案:
1. 检查网络连接和 Maven 仓库服务器状态。
2. 确保依赖项的版本号与项目对应的版本号匹配,并检查 POM 文件中的依赖项是否正确。
3. 清除本地 Maven 仓库缓存(lastUpdated 文件),因为只要存在lastupdated缓存文件,刷新也不会重新下载。本地仓库中,根据依赖的gav属性依次向下查找文件夹,最终删除内部的文件,刷新重新下载即可!
构建管理和插件配置
mvn clean :清理编译或打包后的项目结构,删除target文件夹
mvn compile :编译项目,生成target文件
mvn test: 执行测试源码 (测试)
mvn site :生成一个项目依赖信息的展示页面
mvn package : 打包项目,生成war / jar 文件
mvn install :打包后上传到maven本地仓库(本地部署)
mvn deploy: 只打包,上传到maven私服仓库(私服部署)
注意,命令执行需要我们进入到项目的跟路径,与pom.xml平级,本地部署或是私服仓库部署必须是jar包,war包是部署到远程服务器的打包方式。
周期→包含若干命令→包含若干插件,使用周期命令构建,简化构建过程!最终进行构建的是插件!
<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 继承是指在 Maven 的项目中,让一个项目作为父工程,让其他项目继承该配置信息的机制。继承可以让我们在多个项目中共享同一配置信息,简化项目的管理和维护工作。
1.继承语法 - 父工程 ```xml <groupId>com.atguigu.maven</groupId> <artifactId>pro03-maven-parent</artifactId> <version>1.0-SNAPSHOT</version> <!-- 当前工程作为父工程,它要去管理子工程,所以打包方式必须是 pom --> <packaging>pom</packaging> ``` - 子工程 ```xml <!-- 使用parent标签指定当前工程的父工程 --> <parent> <!-- 父工程的坐标 --> <groupId>com.atguigu.maven</groupId> <artifactId>pro03-maven-parent</artifactId> <version>1.0-SNAPSHOT</version> </parent> <!-- 子工程的坐标 --> <!-- 如果子工程坐标中的groupId和version与父工程一致,那么可以省略 --> <!-- <groupId>com.atguigu.maven</groupId> --> <artifactId>pro04-maven-module</artifactId> <!-- <version>1.0-SNAPSHOT</version> --> ``` 2. 父工程依赖统一管理 - 父工程声明版本 ```xml <!-- 使用dependencyManagement标签声明要导入的依赖 --> <!-- 被声明的依赖并没有真正被引入到工程 --> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>4.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>4.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>4.0.0.RELEASE</version> </dependency> </dependencies> </dependencyManagement> ``` - 子工程引用版本 ```xml <!-- 子工程引用父工程中的依赖信息时,可以把版本号去掉。 --> <!-- 把版本号去掉就表示子工程中这个依赖的版本由父工程决定。 --> <!-- 被管理的依赖真正引入到工程,这是由父工程的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 聚合是指将多个项目组织到一个父级项目中,通过触发父工程的构建,统一按顺序触发子工程构建的过程:通过聚合,可以优化构建顺序,对多个项目进行顺序控制,避免出现构建依赖混乱导致构建失败的情况。
父项目中包含的子项目列表。 ```xml <project> <groupId>com.example</groupId> <artifactId>parent-project</artifactId> <packaging>pom</packaging> <version>1.0.0</version> <modules> <module>child-project1</module> <module>child-project2</module> </modules> </project>
需求案例
配置一个模拟电商平台的依赖,该平台包括用户服务、订单服务、通用工具模块等。
服务依赖:
1. 用户服务 (1.0.1)
- spring-context 6.0.6 
- spring-core 6.0.6
- spring-beans 6.0.6
- jackson-databind / jackson-core / jackson-annotations 2.15.0 
2. 订单服务 (1.0.1)
- shiro-core 1.10.1 
- spring-context 6.0.6 
- spring-core 6.0.6
- spring-beans 6.0.6
3. 通用模块 (1.0.1)
- commons-io 2.11.0
通过查询 https://mvnrepository.com可知1,2中存在某个依赖是另一个依赖的依赖的情况,可以不用重复导入。
1. 父模块搭建 (micro-shop) (1).创建父工程 (2).pom.xml配置 ```xml <?xml version="1.0" encoding="UTF-8"?> <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.0</modelVersion> <groupId>com.atguigu</groupId> <artifactId>micro-shop</artifactId> <version>1.0.1</version> <!-- 父工程不打包,所以选择pom值--> <packaging>pom</packaging> <properties> <spring.version>6.0.6</spring.version> <jackson.version>2.15.0</jackson.version> <shiro.version>1.10.1</shiro.version> <commons.version>2.11.0</commons.version> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <!-- 依赖管理 --> <dependencyManagement> <dependencies> <!-- spring-context会依赖传递core/beans --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <!-- jackson-databind会依赖传递core/annotations --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${jackson.version}</version> </dependency> <!-- shiro-core --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>${shiro.version}</version> </dependency> <!-- commons-io --> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>${commons.version}</version> </dependency> </dependencies> </dependencyManagement> <dependencies> <!-- 父工程添加依赖,会自动传递给所有子工程,不推荐! --> </dependencies> <!-- 统一更新子工程打包插件--> <build> <!-- jdk17 和 war包版本插件不匹配 --> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.2.2</version> </plugin> </plugins> </build> </project> ``` 2. 通用模块 (common-service) (1).创建模块 (2).pom.xml配置 ```xml <?xml version="1.0" encoding="UTF-8"?> <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.0</modelVersion> <parent> <groupId>com.atguigu</groupId> <artifactId>micro-shop</artifactId> <version>1.0.1</version> </parent> <artifactId>common-service</artifactId> <!-- 打包方式默认就是jar!要部署到私服仓库供另外两个子模块使用--> <packaging>jar</packaging> <properties> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <!-- 声明commons-io,继承父工程版本 --> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> </dependency> </dependencies> </project> ``` 3. 用户模块 (user-service) (1).创建模块 (2). pom.xml配置 ```xml <?xml version="1.0" encoding="UTF-8"?> <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.0</modelVersion> <parent> <groupId>com.atguigu</groupId> <artifactId>micro-shop</artifactId> <version>1.0.1</version> </parent> <artifactId>user-service</artifactId> <packaging>war</packaging> <properties> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <!-- 添加spring-context 自动传递 core / beans --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> </dependency> <!-- 添加jackson-databind 自动传递 core / annotations --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency> </dependencies> </project> ``` 4. 订单模块 (order-service) (1).创建模块 (2).pom.xml ```xml <?xml version="1.0" encoding="UTF-8"?> <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.0</modelVersion> <parent> <groupId>com.atguigu</groupId> <artifactId>micro-shop</artifactId> <version>1.0.1</version> </parent> <artifactId>order-service</artifactId> <packaging>war</packaging> <properties> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <!-- 继承父工程依赖版本 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> </dependency> <!-- 继承父工程依赖版本 --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> </dependency> </dependencies> </project> ```
user和order两个要依赖comment,则comment需要部署到本地仓库或私服,通过mvn install或mvn deploy部署后,在user和order的pom.xml文件中 <dependencies>的 <dependency>添加gav属性即可。