Maven 快速入门
Maven 快速入门
- 一、简介
- 1、概述
- 2、特点
- 3、工作原理
- 4、常用命令
- 5、生命周期
- 6、优缺点
- 🎈 面试题
- 二、安装和配置
- 1、安装
- 2、环境配置
- 3、命令测试是否安装成功
- 4、功能配置
- 5、idea配置本地 maven
- 6、maven 工程依赖包查询网站
- 三、基于IDEA创建Maven工程
- 1、maven 工程中的 GAVP
- 2、idea 创建 maven 的 Java 工程
- 3、idea 创建 maven 的 web 工程
- 方式一:手动创建
- 方式二:插件创建
- 4、将 maven 的 web 工程 部署到 tomcat 中
- 5、Maven 标准目录结构
- 四、基于IDEA进行Maven工程构建
- 方式一:命令方式项目构建
- (1)编译、清理
- (2)测试、报告
- (3)打包、安装
- 方式二:可视化方式项目构建
- 五、基于IDEA进行Maven依赖管理
- 1、依赖管理概述
- 2、Maven 依赖范围
- 3、Maven 工程依赖下载失败问题解决方法
- 4、Maven 工程 Build 构建配置
- 六、Maven依赖传递和依赖冲突
- 1、依赖传递的规则
- 2、Maven自动解决依赖冲突规则
- 3、手动解决依赖冲突
- 七、Maven工程继承和聚合关系
- 1、继承
- 2、聚合
- 3、maven 多模块构建综合案例
一、简介
1、概述
Maven是一个基于项目对象模型(POM,Project Object Model)的开源构建工具,主要用于Java项目。它不仅可以 帮助开发者管理项目的构建、依赖管理,还能用于测试、打包和部署等任务。Maven 的核心思想是将项目的所有信息,包括依赖关系、构建过程和插件配置等,都放在一个名为pom.xml的文件中。这个文件描述了项目的基本信息、依赖关系、构建命令等。
2、特点
-
依赖管理:Maven 可以
自动下载和管理项目的所有依赖库,避免手动下载和管理JAR文件。通过pom.xml中指定的依赖项,Maven会从中央仓库或者自定义仓库中自动下载这些库并将它们引入项目。 -
生命周期管理:
Maven的生命周期包括几个阶段,比如compile(编译)、test(测试)、package(打包)、install(安装到本地仓库)和deploy(部署到远程仓库)。你可以在命令行中通过mvn 命令来执行这些操作。 -
插件机制:
Maven提供了丰富的插件来扩展功能。例如,maven-compiler-plugin用于编译Java代码,maven-surefire-plugin用于运行测试,maven-jar-plugin用于打包项目等。通过插件,Maven可以执行几乎所有的构建相关任务。 -
仓库机制:
Maven中的依赖库可以从远程仓库(比如Maven 中央仓库)获取,也可以存储在本地仓库中。开发者还可以设置公司内部的私有仓库,用于管理特定的私有组件。
3、工作原理
pom.xml文件:这是Maven项目的核心配置文件,包含了项目的信息、依赖关系、构建插件和配置。每个Maven项目都有一个pom.xml,该文件会递归解析父子关系的pom.xml文件,形成最终的构建配置。- 仓库管理:
Maven中的依赖是通过Maven仓库管理的,中央仓库是Maven默认的仓库,除此之外还可以配置企业的私有仓库。Maven会首先检查本地仓库中是否已经存在依赖,如果没有则会去远程仓库中下载。
4、常用命令
mvn clean: 删除编译生成的所有文件。mvn compile: 编译项目。mvn test: 运行项目中的测试。mvn package: 打包项目(例如将项目打包成一个 JAR 文件)。mvn install: 将项目的打包结果安装到本地 Maven 仓库。mvn deploy: 将项目部署到远程仓库。mvn site:建立和发布项目站点
5、生命周期
clean生命周期:清理项目default生命周期:构建项目site生命周期:建立和发布项目站点

6、优缺点
优点:
- 简化了项目依赖管理,易于上手;
- 便于功能扩展和项目升级,有助于多模块项目的开发;
缺点:
maven是一个庞大的构建系统,学习难度大;maven采用约定优于配置的策略,虽然上手容易,但是一旦出了问题,难于调试。- 中国的网络环境差,很多
repository无法访问,比如google code,jboss 仓库无法访问等。
🎈 面试题
1.
Maven 规约:
/src/main/java/:Java 源码。/src/main/resource:Java 配置文件,资源文件。/src/test/java/:Java 测试代码。/src/test/resource:Java 测试配置文件,资源文件。/target:文件编译过程中生成的.class文件、jar、war等等。pom.xml:配置文件
2.
对于一个多模块项目,如何管理项目依赖的版本:
- 通过在
父模块中声明dependencyManagement和pluginManagement, 然后让子模块通过<parent>元素指定父模块,这样子模块在定义依赖是就可以只定义groupId和artifactId,自动使用父模块的version,这样统一整个项目的依赖的版本。
3.
多模块如何聚合:
- 配置一个打包类型为
pom的聚合模块,然后在该pom中使用<module>元素声明要聚合的模块
4.
常见的 Maven 私服的仓库类型:
- (
宿主仓库)hosted repository- (
代理仓库)proxy repository- (
仓库组)group repository
5.
解决依赖冲突:
- 使用
<exclusions>标签排除依赖传递
二、安装和配置
1、安装
maven 版本下载
| 工具 | 版本 |
|---|---|
IDEA | 2024.1.3 |
JDK | 17 |
MAVEN | 3.8.8 |
-
安装条件:
maven需要本机安装Java环境,必须包含Java_home环境变量。 -
软件下载:

-
软件安装:免安装,解压到指定目录即可
-
软件结构:

-
bin 文件夹:用来执行
Maven 命令的地方 -
boot 文件夹:包含用于启动
Maven时加载的类和资源。它的作用是加载Maven的必要组件和启动环境。 -
conf 文件夹:这个目录存放
Maven的 全局配置文件settings.xml文件。该文件用于配置 Maven 的行为,例如代理设置、本地仓库位置等。 -
lib 文件夹:这个目录中存放了
Maven运行所需的所有依赖库,包括Maven 核心库、插件库等。 -
LICENSE 文件:这是
Maven软件的开源许可证文件,通常是Apache License 2.0,用户可以查看Maven的许可条款。 -
NOTICE 文件:该文件列出了
Maven依赖的开源项目和相关版权信息,通常会提到使用了哪些第三方库或工具。 -
README.txt 文件:提供关于
Maven的基础说明和使用指南,一般是一些简短的说明文档,帮助用户快速上手。
2、环境配置
-
配置 MAVEN_HOME

-
配置环境变量 PATH

3、命令测试是否安装成功
mvn -v: 查看
maven安装版本

4、功能配置
修改
conf\settings.xml配置文件中以下内容
1. 本地仓库位置
<localRepository>自己设置的地址</localRepository>

2. maven国内阿里镜像网站
<mirror><id>alimaven</id><name>aliyun maven</name><url>https://maven.aliyun.com/repository/public/</url><mirrorOf>central</mirrorOf></mirror>

3. maven选用编译项目的jdk版本
<profile><id>jdk-17</id><activation><activeByDefault>true</activeByDefault><jdk>17</jdk></activation><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><maven.compiler.compilerVersion>17</maven.compiler.compilerVersion></properties></profile>

5、idea配置本地 maven



6、maven 工程依赖包查询网站
maven 工程依赖包查询网站
三、基于IDEA创建Maven工程
1、maven 工程中的 GAVP
在
Maven项目中,GAVP是指项目的四个核心概念,用于唯一标识Maven工程及其构件。
GroupId确定项目的组织归属。
<!--一个 GroupId 可以包含多个项目-->
<groupId>com.example.myproject</groupId>
ArtifactId确定项目或模块的名称。
<!--每个项目或模块都有唯一的 ArtifactId,并且在相同的 GroupId 下,ArtifactId 必须唯一-->
<artifactId>my-app</artifactId>
Version确定项目的版本信息。
<!--
SNAPSHOT:代表未正式发布的开发版本
Release:代表已发布的稳定版本
例如:
1.0.0-SNAPSHOT 表示开发中的版本;
1.0.0 表示正式发布的稳定版本。
-->
<version>1.0.0</version>
Packaging确定项目的打包方式。
<packaging>jar</packaging>
常见的
packaging类型:
jar:默认值,标准的Java类库,代表普通Java工程,打包后以.jar结尾。war:用于Web应用,代表web工程, 打包后以.war结尾。pom:不会打包,仅包含pom.xml配置文件的聚合项目(表示该项目是一个聚合项目,用来管理其他模块),用于做继承的父工程。
综合示例:
一个完整的Maven工程POM文件中的GAVP信息可能如下:
<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.example.myproject</groupId><artifactId>my-app</artifactId><version>1.0.0-SNAPSHOT</version><packaging>jar</packaging><!-- 其他配置... -->
</project>
注意:
继承与聚合项目:在多模块项目中,父项目的 packaging 通常是 pom,并且父项目可以管理子模块的 GroupId 和 Version,子模块通常只需定义 ArtifactId。
2、idea 创建 maven 的 Java 工程



创建完成之后效果:
3、idea 创建 maven 的 web 工程
方式一:手动创建
- 创建一个
maven的Javase工程- 修改
pom.xml文件的打包方式- 设置
web资源路径和web.xml路径




方式二:插件创建
- 安装插件:
JavaToWeb- 创建一个
maven的Javase工程- 设置
web资源路径和web.xml路径




4、将 maven 的 web 工程 部署到 tomcat 中




5、Maven 标准目录结构
my-maven-project/
│
├── pom.xml // Maven 项目核心配置文件
├── src/ // 源代码目录
│ ├── main/ // 项目主代码(包括 Java、资源等)
│ │ ├── java/ // Java 源代码
│ │ ├── resources/ // 项目资源文件(配置文件等)
│ │ ├── filters/ // 资源文件过滤器
│ │ └── webapp/ // Web 项目的 web 资源(如 HTML、CSS)
│ │
│ ├── test/ // 测试代码(包括 Java 测试和资源等)
│ │ ├── java/ // 测试用例的 Java 源代码
│ │ ├── resources/ // 测试用例所需的资源文件
│ │ └── filters/ // 测试资源文件过滤器
│
└── target/ // Maven 编译和打包生成的文件(如 class、jar 等)└── *.jar // 打包生成的 JAR 文件或 WAR 文件
四、基于IDEA进行Maven工程构建
方式一:命令方式项目构建
(1)编译、清理
mvn clean:清理
mvn compile:编译
maven_java工程下编写一个Java类pom.xml文件中引入lombok依赖pom.xml文件目录下打开命令窗口,执行maven命令






(2)测试、报告
mvn clean:清理
mvn test-compile:编译测试类
mvn test:测试
mvn clean test:清理后直接测试,并生成测试报告surefire-reports文件夹
maven_java工程下编写一个Java测试类pom.xml文件中引入junit依赖pom.xml文件目录下打开命令窗口,执行maven命令



(3)打包、安装
mvn package:打包
- 最终打成的无论是
jar包还是war包,里面是不包含测试代码的,只有核心功能代码,因为测试是打包之前的操作,既然能打包成功,说明测试没有问题
打包和安装区别:
打包是将工程打成jar包或war包文件,并保存到target目录下安装是将工程打包生成的jar包或war包文件安装到本地仓库,会按照坐标保存到指定位置
安装示例
- 假如 有
maven_java、maven_web两个maven工程,maven_web工程要依赖使用maven_java工程,要按照以下步骤:
- 首先将打成的
maven_java工程jar包安装到本地仓库;- 然后在
maven_web工程的pom.xml文件中引入maven_java工程坐标,否则maven_web工程无法找到依赖,无法打包- 打包
maven_web工程


安装:



方式二:可视化方式项目构建

maven_java pom.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.ningxia.maven</groupId><artifactId>maven_java</artifactId><version>1.0-SNAPSHOT</version><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><!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.24</version><scope>provided</scope></dependency><!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.9.2</version><scope>test</scope></dependency></dependencies>
</project>
maven_web pom.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.ningxia.maven</groupId><artifactId>maven_web</artifactId><version>1.0-SNAPSHOT</version><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><build><plugins><!-- jdk 17 和 war包版本不匹配 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>3.2.2</version></plugin></plugins></build><dependencies><dependency><groupId>com.ningxia.maven</groupId><artifactId>maven_java</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies></project>
五、基于IDEA进行Maven依赖管理
1、依赖管理概述
1. 依赖管理: 通过定义项目所需要的库,自动下载和管理这些库,避免手动配置的繁琐。
2.Maven工程核心信息配置和解读 (GAVP):每个Maven项目都通过其核心信息配置GAVP(Group ID、Artifact ID、Version、Packaging)这四个信息来唯一标识和管理。
3.Maven工程依赖管理配置:pom.xml文件中定义项目所需的依赖,如何添加第三方库等。
4. 依赖范围:Maven中的依赖范围(Scope),如compile、provided、runtime、test和system,这些范围决定了依赖在编译、运行时等不同阶段的可见性和作用。
5. Maven 工程依赖下载失败情境错误解决 (重点): 讨论在 Maven 下载依赖时可能会遇到的错误,以及如何处理这些错误,尤其是如何解决依赖下载失败的问题。这部分是重点,可能会涉及网络配置、仓库设置、依赖版本冲突等常见问题的解决办法。
6. Maven 工程 Build 构建配置: 这一部分会介绍如何配置和管理 Maven 工程的构建过程。主要包括构建生命周期(build lifecycle)、构建阶段(build phases)和插件的使用等,确保项目能够成功打包、测试和部署。
2、Maven 依赖范围
Maven的依赖范围(Scope)用于控制项目中依赖库在不同阶段(编译、测试、运行等)的可见性和可用性。通过设置依赖范围,可以有效管理依赖的使用场景,减少不必要的依赖包,提高项目构建效率。以下是Maven中常见的几种依赖范围:
3、Maven 工程依赖下载失败问题解决方法
1. 网络问题导致依赖下载失败
- 检查网络连接:确保本地计算机能够正常访问互联网;
- 更换仓库地址:如果
Maven仓库(如Maven Central)不可用,可以在pom.xml或settings.xml中指定其他可用的镜像仓库:如:阿里云
2. 依赖库版本冲突:
Maven项目中可能引入了不同版本的同一个依赖库,导致下载失败或构建错误。
- 使用
mvn dependency:tree命令:查看依赖树,找到版本冲突的依赖库。- 排除冲突的依赖:在
pom.xml文件中,通过<exclusions>标签排除 排除 的或不需要的依赖版本:
<dependency><groupId>com.example</groupId><artifactId>example-lib</artifactId><version>1.0</version><exclusions><exclusion><groupId>com.other</groupId><artifactId>conflict-lib</artifactId></exclusion></exclusions>
</dependency>
3.本地
Maven仓库存储问题
- 根据报错的依赖坐标
GAV直接定位到本地仓库,手动删除整个依赖文件夹,然后重新下载
4、Maven 工程 Build 构建配置
1. 指定构建资源文件的名称,非默认名称:
- 默认情况下,Maven在压缩项目时会生成一个
.jar或.war文件,并且文件名称通常是基于pom.xml中指定的artifactId和version自动生成的,例如my-app-1.0-SNAPSHOT.jar。- 通过自定义配置,可以为生成的资源文件指定不同的名称。例如,如果你想要一个简洁的名称或者特定格式的文件名,可以在中
pom.xml通过元素进行配置:
<build><finalName>custom-name</finalName>
</build>
2. 制定构建打包时,指定包含文件格式和排除文件::
- 构建过程中,可以根据需要指定哪些文件或目录应该
包含在最终的备份文件中,哪些不包含。例如,您可能希望备份时排除某些临时文件或开发过程中使用的工具文件。- 您可以通过
<includes>和<excludes>标签来配置资源时的文件包含和排除规则:
<build><resources><resource><directory>src/main/resources</directory><includes><include>**/*.properties</include></includes><excludes><exclude>**/*.xml</exclude></excludes></resource></resources>
</build>
以上配置会在备用时 只包含.properties文件,而排除.xml文件。
3. 配置插件:
在Maven项目中,可以通过配置插件来增强项目的功能,比如:在pom.xml中使用Tomcat Maven Plugin将项目部署到Tomcat容器中进行调试或运行。以下是配置Tomcat插件的示例,并详细讲解如何使用它。
<build><plugins><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId> <!-- 或 tomcat9-maven-plugin --><version>2.2</version><configuration><url>http://localhost:8080/manager/text</url> <!-- Tomcat 服务器管理URL --><server>TomcatServer</server> <!-- 在 settings.xml 中配置的认证ID --><path>/my-webapp</path> <!-- 部署时的项目访问路径 --><username>admin</username> <!-- Tomcat 用户名 --><password>admin-password</password> <!-- Tomcat 密码 --><uriEncoding>UTF-8</uriEncoding></configuration></plugin></plugins>
</build>

六、Maven依赖传递和依赖冲突
1、依赖传递的规则
假如
A依赖B,B依赖C,C是否传递到A,取决于B依赖C时使用的依赖范围以及配置。
-
B依赖C时使用compile作用域:可以传递;使用 非compile(如: test 或 provided )作用域:不可以传递
-
B依赖C时,如果配置了<optional>true</optional>标签:不能传递到A
B的pom.xml如下:
-----------------------------------------
<dependencies><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.15</version><optional>true</optional></dependency>
</dependencies>
总结:
依赖传递终止:
1. 非 compile作用域的依赖传递会终止
2. 使用 <optional>true</optional> 标签配置会中止传递
2、Maven自动解决依赖冲突规则
- 路径最短优先原则(
第一原则) pom.xml文件中声明顺序优先规则(第二原则)子pom.xml内声明的优先于父pom.xml中的依赖
A通过路径A -> B -> C -> D -> E -> X(0.0.1)和路径A -> F -> X(0.0.2)引入不同版本的依赖,Maven会选择X-0.0.2,因为通过F的路径比通过B的路径更短。- 当
路径长度相同的情况下,Maven会选择在pom.xml中声明顺序靠前的依赖。
因为E在F之前声明,Maven会选择X-0.0.1版本。<dependencies><dependency><groupId>com.example</groupId><artifactId>E</artifactId><version>1.0.0</version></dependency><dependency><groupId>com.example</groupId><artifactId>F</artifactId><version>1.0.0</version></dependency>
</dependencies>
3、手动解决依赖冲突
- 排除依赖:你可以通过
<exclusions>标签显式排除某些不需要的依赖,避免冲突。
通过这种方式,B项目中的X-1.0.jar不会被传递到A项目,避免冲突<dependencies><dependency><groupId>com.example</groupId><artifactId>B</artifactId><version>1.0.0</version><exclusions><exclusion><groupId>com.example</groupId><artifactId>X</artifactId></exclusion></exclusions></dependency>
</dependencies>
- 使用
dependencyManagement统一管理依赖版本:在多模块项目中,使用dependencyManagement可以统一管理依赖的版本号,确保各模块使用相同版本的依赖。
A项目可以强制所有子模块使用X-2.0.0版本,避免冲突<dependencyManagement><dependencies><dependency><groupId>com.example</groupId><artifactId>X</artifactId><version>2.0.0</version></dependency></dependencies>
</dependencyManagement>
七、Maven工程继承和聚合关系
1、继承
继承是
Maven中用于共享配置的一种机制。通过继承,子项目可以复用父项目中定义的插件、依赖、配置项等。子项目通过<parent>标签指定要继承的父项目
父项目 pom.xml:
<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.example</groupId><artifactId>parent-project</artifactId><version>1.0.0</version><packaging>pom</packaging><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><version>2.5.4</version></dependency></dependencies>
</project>
子项目pom.xml:
在下面示例中,child-project继承了parent-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.0</modelVersion><parent><groupId>com.example</groupId><artifactId>parent-project</artifactId><version>1.0.0</version></parent><artifactId>child-project</artifactId><!-- 可以覆盖或添加依赖 --><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.5.4</version></dependency></dependencies>
</project>
2、聚合
聚合是一种将多个模块组织在一起并通过一个父项目统一管理它们的构建方式。
父项目不需要是一个实际的执行项目,它只是一个容器项目,用于管理子模块,只需要一个pom.xml配置文件即可- 在
父项目的pom.xml文件中,通过<modules>标签列出所有的子模块。每个子模块对应一个相对路径。- 运行
父项目的mvn install或mvn clean等命令时,会梯度地构建所有子模块。
下面的parent-project就是一个聚合项目,module1并且module2是它的子模块。
在执行mvn install时,module1并且module2会被自动构建。<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.example</groupId><artifactId>parent-project</artifactId><version>1.0.0</version><packaging>pom</packaging><modules><module>module1</module><module>module2</module></modules>
</project>
3、maven 多模块构建综合案例
项目结构
my-project (父模块)
│
├── my-common-module (公共模块)
│
├── my-module-a (子模块A)
│
├── my-module-b (子模块B)
│
└── my-module-c (子模块C)
父模块
my-project/pom.xml
<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.example</groupId><artifactId>my-project</artifactId><version>1.0.0</version><!-- 定义打包类型为 pom ,表示不会生成任何可执行的jar或war文件,而是一个容器管理和构建它的子模块。 --><packaging>pom</packaging><modules><module>my-common-module</module><module>my-module-a</module><module>my-module-b</module><module>my-module-c</module></modules><properties><java.version>17</java.version><spring.version>5.3.21</spring.version></properties><dependencyManagement><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.12.5</version></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>${java.version}</source><target>${java.version}</target></configuration></plugin></plugins></build>
</project>
公共模块
my-common-module/pom.xml
<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.example</groupId><artifactId>my-project</artifactId><version>1.0.0</version><relativePath>../pom.xml</relativePath></parent><artifactId>my-common-module</artifactId><dependencies><!-- 公共模块中定义了常用的依赖 --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></dependency></dependencies>
</project>
子模块 A
my-module-a/pom.xml
<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.example</groupId><artifactId>my-project</artifactId><version>1.0.0</version><relativePath>../pom.xml</relativePath></parent><artifactId>my-module-a</artifactId><dependencies><!-- 依赖公共模块 --><dependency><groupId>com.example</groupId><artifactId>my-common-module</artifactId><version>1.0.0</version></dependency><!-- 子模块A独有的依赖 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.12.0</version></dependency></dependencies>
</project>
子模块 B
my-module-b/pom.xml
<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.example</groupId><artifactId>my-project</artifactId><version>1.0.0</version><relativePath>../pom.xml</relativePath></parent><artifactId>my-module-b</artifactId><dependencies><!-- 依赖公共模块 --><dependency><groupId>com.example</groupId><artifactId>my-common-module</artifactId><version>1.0.0</version></dependency><!-- 子模块B独有的依赖 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-io</artifactId><version>2.11.0</version></dependency></dependencies>
</project>
子模块 C
my-module-c/pom.xml
<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.example</groupId><artifactId>my-project</artifactId><version>1.0.0</version><relativePath>../pom.xml</relativePath></parent><artifactId>my-module-c</artifactId><dependencies><!-- 依赖公共模块 --><dependency><groupId>com.example</groupId><artifactId>my-common-module</artifactId><version>1.0.0</version></dependency><!-- 子模块C的独有依赖与模块B存在依赖冲突 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-io</artifactId><version>2.10.0</version> <!-- 与my-module-b冲突的版本 --></dependency></dependencies><!-- 解决依赖冲突 --><dependencyManagement><dependencies><dependency><groupId>org.apache.commons</groupId><artifactId>commons-io</artifactId><version>2.11.0</version> <!-- 统一版本 --></dependency></dependencies></dependencyManagement>
</project>
<relativePath>../pom.xml</relativePath>是Maven parent元素中的一个配置,用来指定当前子模块相对于父模块的pom.xml文件的相对路径。
示例
在下面这个结构中:
- 子模块
my-module-a的pom.xml文件位于my-project/my-module-a目录下。- 父模块的
pom.xml位于上一级目录my-project/pom.xml。
因此,子模块
my-module-a/pom.xml中的relativePath使用../pom.xml,表示相对my-module-a目录,返回到上一级的my-project目录并引用其中的pom.xml。
my-project (父模块)
│
├── pom.xml (父模块的pom文件)
│
├── my-module-a (子模块A)
│ └── pom.xml
├── my-module-b (子模块B)
│ └── pom.xml
└── my-module-c (子模块C)└── pom.xml
默认行为:
如果不指定
<relativePath>,Maven默认会假定父模块的pom.xml位于子模块目录的上一级,因此在常见的项目结构中,即使不写<relativePath>,Maven也能找到父模块。不过,如果父模块的pom.xml不在默认位置,或者项目结构比较复杂时,显式指定relativePath是有帮助的。
相关文章:
Maven 快速入门
Maven 快速入门 一、简介1、概述2、特点3、工作原理4、常用命令5、生命周期6、优缺点🎈 面试题 二、安装和配置1、安装2、环境配置3、命令测试是否安装成功4、功能配置5、idea配置本地 maven6、maven 工程依赖包查询网站 三、基于IDEA创建Maven工程1、maven 工程中的…...
OpenCV-人脸检测
文章目录 一、人脸检测流程二、关键方法三、代码示例四、注意事项 OpenCV是一个开源的计算机视觉和机器学习软件库,它提供了多种人脸检测方法,以下是对OpenCV人脸检测的详细介绍: 一、人脸检测流程 人脸检测是识别图像中人脸位置的过程&…...
【重磅升级】基于大数据的股票量化分析与预测系统
温馨提示:文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 伴随全球经济一体化和我国经济的快速发展,中国股票市场对世界经济的影响力不断攀升,中国股市已成为全球第二大股票交易市场。在当今的金融市场中,股票价格的波动…...
python全栈学习记录(二十四)元类、异常处理
元类、异常处理 文章目录 元类、异常处理一、元类1.元类控制类的实例化2.属性/方法的查找顺序3.单例 二、异常处理 一、元类 1.元类控制类的实例化 类的__call__方法会在产生的对象被调用时自动触发,args和kwargs就是调用实例时传入的参数,返回值是调用…...
Golang Slice扩容机制及注意事项
Golang Slice扩容机制及注意事项: 在 Go语言中,Slice(切片)是一种非常灵活且强大的数据结构,它是对数组的抽象,提供了动态数组的功能。Slice 的扩容机制是自动的,但了解其背后的原理对于编写高…...
华为OD机试 - 猜数字 - 暴力枚举(Python/JS/C/C++ 2024 E卷 100分)
华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试真题(Python/JS/C/C)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,…...
Flink触发器Trigger
前言 在 Flink 窗口计算模型中,数据先经过 WindowAssigner 分配窗口,然后再经过触发器 Trigger,Trigger 决定了一个窗口何时被 ProcessFunction 处理。每个 WindowAssigner 都有一个默认的 Trigger,如果默认的不满足需求…...
【操作系统的使用】Linux 系统环境变量与服务管理:设置与控制的艺术
文章目录 系统环境变量与服务管理:设置与控制的艺术一、系统环境变量的设置1.1 临时设置环境变量1.2 永久设置环境变量 二、服务启动类型的设置2.1 查看服务状态2.2 启动和停止服务2.3 设置服务的启动类型2.3.1 设置服务在启动时运行2.3.2 禁用服务在启动时运行2.3.…...
速盾:高防cdn配置中性能优化是什么?
高防CDN配置中的性能优化是指通过调整CDN配置以提升网站的加载速度、响应时间和用户体验。在进行性能优化时,需要考虑多个因素,包括CDN节点的选择和布置、缓存策略、缓存过期时间、预取和预加载、并发连接数和网络延迟等。 首先,CDN节点的选…...
Qt_软件添加版本信息
文章内容: 给生成的软件添加软件的版权等信息 #include <windows.h> //中文的话增加下面这一行 #pragma code_page(65001)VS_VERSION_INFO VERSIONINFO...
mallocfree和newdelete的区别
malloc\free和new\delete的区别 malloc/free new/delete 身份: 函数 运算符\关键字 返回值: void* 带类型的指针 参数: 字节个数(手动计算) 类型 自动计算字节数 处理数组: 手动计算数组总字节数 new 类型[数量] 扩容࿱…...
无锁队列实现(Michael Scott),伪代码与c++实现
一、Michael & Scoot 原版伪代码实现 structure pointer_t {ptr: pointer to node_t, count: unsigned integer}structure node_t {value: data type, next: pointer_t}structure queue_t {Head: pointer_t, Tail: pointer_t}initialize(Q: pointer to queue_t)node new_…...
猜数字小游戏
前言 猜数字游戏是一款经典且简单的互动游戏,常常用于提高逻辑思维能力和锻炼数学技巧。本文将深入探讨一段用 JavaScript 编写的猜数字游戏代码,帮助读者理解游戏的基本逻辑和实现方法。这段代码不仅适合初学者练习编程技巧,也是了解用户交…...
在Windows上搭建ChatTTS:从本地部署到远程AI音频生成全攻略
文章目录 前言1. 下载运行ChatTTS模型2. 安装Cpolar工具3. 实现公网访问4. 配置ChatTTS固定公网地址 前言 本篇文章主要介绍如何快速地在Windows系统电脑中本地部署ChatTTS开源文本转语音项目,并且我们还可以结合Cpolar内网穿透工具创建公网地址,随时随…...
如何用好 CloudFlare 的速率限制防御攻击
最近也不知道咋回事儿,群里好多站长都反映被CC 攻击了。有人说依旧是 PCDN 干的,但明月感觉不像,因为有几个站长被 CC 攻击都是各种动态请求(这里的动态请求指的是.php 文件的请求)。经常被攻击的站长们都知道,WordPress /Typecho 这类动态博客系统最怕的就是这种动态请求…...
Unity3D 立方体纹理与自制天空盒详解
立方体纹理和自制天空盒是游戏开发中常用的技术之一,可以为游戏增添更加丰富的视觉效果。在本文中,我们将详细介绍Unity3D中立方体纹理和自制天空盒的使用方法,并给出相应的代码实现。 对惹,这里有一个游戏开发交流小组ÿ…...
【工具】VSCODE下载,配置初次设置
打开 settings.json 文件,包含了 Visual Studio Code (VSCode) 中的各种用户配置。 {"files.associations": {"*.vue": "vue","*.wpy": "vue","*.wxml": "html","*.wxss": "…...
vue使用jquery的ajax,页面跳转
一、引入jquery依赖 打开终端更新npm npm install -g npm 更新完后引入输入npm install jquery 加载完后 在最外层的package.json文件中加入以下代码 配置好后导入jquery 设置变量用于接收服务器传输的数据 定义ajax申请数据 服务器的Controller层传输数据 (…...
基于微信小程序的社区二手交易系统的详细设计和实现(源码+lw+部署文档+讲解等)
项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念,提供了一套默认的配置,让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…...
D34【python 接口自动化学习】- python基础之输入输出与文件操作
day34 文件关闭 学习日期:20241011 学习目标:输入输出与文件操作﹣-46 常见常新:文件的关闭 学习笔记: 文件关闭的内部工作过程 close()函数 with语句 常用的打开关闭文件 # 文件关闭 # 方式…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...





