Maven入门到进阶:构建、依赖与插件管理详解
文章目录
- 一、Maven介绍
- 1、什么是Maven
- 2、Maven的核心功能
- 二、Maven核心概念
- 1、坐标GAVP
- 1.1、GroupId
- 1.2、ArtifactId
- 1.3、Version
- 1.3.1、版本号的组成
- 1.4、Packaging
- 2、POM、父POM和超级POM
- 2.1、POM (Project Object Model)
- 2.1、父POM(Parent POM)
- 2.3、超级POM(Super POM)
- 2.4、有效POM(Effective POM)
- 2.4.1、如何查看有效POM?
- 2.4.2、有效POM的用途
- 三、Maven依赖管理
- 1、依赖范围
- 1.1、compile(编译范围)
- 1.2、provided(已提供范围)
- 1.3、runtime(运行时范围)
- 1.4、test(测试范围)
- 1.5、system(系统范围)
- 1.6、import(导入范围)
- 2、依赖传递
- 2.1、依赖传递的作用范围
- 2.2、可选依赖
- 2.3、依赖冲突与版本控制
- 四、Maven工程构建
- 1、生命周期
- 2、构建命令
- 2.1、常见组合命令
- 2.2、命令选项
- 3、插件
- 3.1、Maven默认的插件
- 3.2、生成微服务可运行jar包
- 3.2.1、添加spring-boot-maven-plugin插件后的打包流程
- 3.2.2、常规打包方式
- 3.2.3、进阶打包方式
- 3.3、\<resources>标签
- 五、Maven继承和聚合
- 1、继承
- 1.1、父项目的pom.xml
- 1.2、子项目pom.xml
- 1.2.1、\<relativePath>标签
- 2、聚合
- 五、Maven仓库
- 1、Maven仓库
- 1.1、本地仓库(Local Repository)
- 1.2、中央仓库(Central Repository)
- 1.3、远程仓库(Remote Repository)
- 1.4、Maven仓库的工作原理
- 2、Maven私服
- 2.1、Nexus仓库
- 2.2、通过Nexus下载jar包
- 2.3、将jar包部署到Nexus
- 3、repositories和mirrors
- 3.1、repositories(仓库)
- 3.2、mirrors(镜像)
一、Maven介绍
1、什么是Maven
Maven是Apache
软件基金会开发的一款项目管理
和构建工具
,主要用于Java 项目的构建
、依赖管理
和项目生命周期管理
。Maven通过声明性配置(XML 文件)定义项目构建流程及依赖项,使得项目管理更简单、更高效,特别适合于多模块、大型项目。
2、Maven的核心功能
依赖管理
:自动解析、下载和管理项目所需的外部依赖库,避免手动查找和添加 JAR 包构建管理
:通过标准化的构建生命周期(例如 clean、compile、test、package、install、deploy),帮助用户自动化地编译代码、运行测试、打包成JAR/WAR包等插件扩展
:Maven 拥有丰富的插件生态系统,能够扩展构建过程中的功能,包括代码质量检查、测试覆盖率报告、打包部署等项目统一管理
:Maven允许通过父子项目、聚合项目等结构,统一管理多模块项目,使团队协作更高效
二、Maven核心概念
1、坐标GAVP
在Maven中,GAVP是构建项目的四个核心属性的缩写,分别代表GroupId
、ArtifactId
、Version
和Packaging
。这四个属性在pom.xml
文件中定义,用于唯一标识一个Maven项目或依赖。
1.1、GroupId
- 定义:项目或组件的组ID,通常表示项目所在的
组织、公司或团队
- 用途:帮助区分不同的项目组和模块。GroupId通常以
域名倒置
的格式(如com.example
)命名,以避免命名冲突 - 示例:
<groupId>com.example</groupId>
1.2、ArtifactId
- 定义:项目或模块的标识符,是
项目的名称或模块名称
,通常是小写的、简短的名称 - 用途:用于唯一标识项目中的某个模块。通常一个项目会有多个模块,每个模块的ArtifactId都是唯一的
- 示例:
<artifactId>my-app</artifactId>
1.3、Version
- 定义:项目的版本号,通常遵循语义化版本号(如
1.0.0
、1.0-SNAPSHOT
等) - 用途:帮助区分不同版本的构件。Maven支持
SNAPSHOT
版本(用于开发阶段)和RELEASE
版本(用于发布的稳定版本) - 示例:
<version>1.0.0</version>
1.3.1、版本号的组成
- Maven的版本号通常由
主版本号
、次版本号
、补丁版本号
和标识符
组成。其基本格式如下:
<major>.<minor>.<patch>-<qualifier>
- 主版本号 (Major Version)
- 作用: 主版本号在项目发生
重大更改
,可能导致向后不兼容时会更新。例如,修改了API接口或删除了某些功能,升级主版本号 - 示例:
1.0.0
→2.0.0
- 作用: 主版本号在项目发生
- 次版本号 (Minor Version)
- 作用: 次版本号通常表示项目有了
新功能
,但向后兼容。例如,增加了新功能,但不影响现有功能的使用 - 示例:
1.0.0
→1.1.0
- 作用: 次版本号通常表示项目有了
- 补丁版本号 (Patch Version)
- 作用: 补丁版本号通常用于
修复错误
或进行小的改进,确保向后兼容 - 示例:
1.0.0
→1.0.1
- 作用: 补丁版本号通常用于
- 标识符 (Qualifier)
- 作用: 标识符用于
标识
预发布版本或特殊版本,比如快照版本、测试版或里程碑版本 - 常见的附加标识符有以下几种
- 作用: 标识符用于
附加标识符 | 含义 | 适用阶段 | 示例 |
---|---|---|---|
SNAPSHOT | 开发中的不稳定版本 ,尚未发布 | 开发过程 | 1.0.0-SNAPSHOT |
ALPHA | 早期测试版本,可能包含较多 bug,功能未完全实现 | 内部测试 | 1.0.0-ALPHA |
BETA | 稳定性较高的测试版本,功能基本完成 | 公开测试 | 1.0.0-BETA |
RC | 候选发布版本 ,接近正式版本 | 发布前测试 | 1.0.0-RC1 |
M | 里程碑版本 ,标志关键特性的阶段性完成 | 项目阶段性成果 | 1.0.0-M1 |
GA | 正式发布版本 ,供所有用户使用 | 正式发布 | 1.0.0-GA |
FINAL | 最终稳定版本 ,适合大规模使用 | 正式发布 | 1.0.0-FINAL |
HOTFIX | 紧急修复版本,快速解决严重问题 | 紧急修复 | 1.0.1-HOTFIX |
DEV | 开发版本,类似于 SNAPSHOT | 开发过程 | 1.0.0-DEV |
CUSTOM | 定制版本,针对特定客户或项目需求 | 定制化发布 | 1.0.0-CUSTOM |
PREVIEW | 预览版本,展示即将发布的功能 | 用户或客户展示 | 1.0.0-PREVIEW |
CANARY | 实验版,用于有限发布和生产环境验证 | 实验性发布 | 1.0.0-CANARY |
EAP | Early Access Program,早期访问版 | 内部或有限外部访问 | 1.0.0-EAP |
NIGHTLY | 每晚构建的版本,通常用于开发中的自动化测试 | 开发过程 | 1.0.0-NIGHTLY |
STAGING | 预发布版本,通常用于发布到生产环境前的测试 | 预生产环境 | 1.0.0-STAGING |
TEST | 用于测试目的的版本,可能包含调试信息 | 内部测试 | 1.0.0-TEST |
INTEGRATION | 用于集成测试的版本 | 集成测试 | 1.0.0-INTEGRATION |
DEMO | 演示版本,通常用于客户或内部展示 | 展示用途 | 1.0.0-DEMO |
EXPERIMENTAL | 实验版本,包含实验性功能或不稳定的更改 | 开发测试 | 1.0.0-EXPERIMENTAL |
LTS | 长期支持版本 ,通常包含稳定且经验证的功能 | 正式发布 | 1.0.0-LTS |
RELEASE | 稳定的正式发布版本 ,类似于 GA 和 FINAL | 正式发布 | 1.0.0-RELEASE |
ROLLOUT | 渐进式发布版本,逐步向用户推广 | 渐进式发布 | 1.0.0-ROLLOUT |
PATCH | 小型补丁版本,用于特定问题的快速修复 | 快速修复 | 1.0.1-PATCH |
snapshot
表示快照版,它不是个稳定版本,属于开发过程中使用的版本- 当一个项目开发完成后,就会进入测试版本,而测试版本一般会分为
内部测试alpha版
、外部测试beta版
两种 - 当测试通过后,将会进入正式版本,大部分的正式版是啥也不带,就一个单纯的版本号,比如1.0、1.7.1等。也有个别的是这些
rc、final、release、ga
等
1.4、Packaging
- 定义:指定项目的
打包类型
,决定了Maven最终生成的文件格式 - 常见的打包类型:
- jar:用于生成Java的
jar
文件 - war:用于生成Web应用的
war
文件 - pom:通常用于
父项目
或聚合项目
,表示该项目不会打包成可执行文件,而是用于组织多个模块
- jar:用于生成Java的
- 示例:
<packaging>jar</packaging>
2、POM、父POM和超级POM
2.1、POM (Project Object Model)
POM是Maven项目的核心文件,通常命名为pom.xml
,包含了项目的配置信息、依赖关系、插件、构建设置等。每个Maven项目都需要一个POM文件,它决定了如何构建和管理项目。
以下是一个详细的 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.0http://maven.apache.org/maven-v4_0_0.xsd"><!-- modelVersion: 定义 POM 文件的版本,通常为 4.0.0 --><modelVersion>4.0.0</modelVersion><!-- groupId: 项目的组 ID,通常是项目所在组织的域名反转形式 --><groupId>com.example</groupId><!-- artifactId: 项目的标识符,通常是项目的名称 --><artifactId>my-app</artifactId><!-- version: 项目的版本号 --><version>1.0.0</version><!-- packaging: 打包类型,默认为 jar。其他值可以是 war、pom 等 --><packaging>jar</packaging><!-- name: 项目的名称(可选) --><name>My Application</name><!-- description: 项目的简短描述(可选) --><description>This is my first Maven project.</description><!-- url: 项目主页的 URL(可选) --><url>http://www.example.com/my-app</url><!-- licenses: 项目使用的许可证信息 --><licenses><license><name>Apache License, Version 2.0</name><url>http://www.apache.org/licenses/LICENSE-2.0</url><distribution>repo</distribution></license></licenses><!-- developers: 项目的开发人员信息 --><developers><developer><id>johndoe</id><name>John Doe</name><email>johndoe@example.com</email><organization>Example Org</organization><roles><role>developer</role></roles></developer></developers><!-- dependencies: 定义项目依赖的外部库 --><dependencies><dependency><!-- groupId: 依赖的组 ID --><groupId>org.springframework</groupId><!-- artifactId: 依赖的标识符 --><artifactId>spring-core</artifactId><!-- version: 依赖的版本 --><version>5.2.9.RELEASE</version><!-- scope: 依赖的作用范围,默认为 compile,还可以是 test、provided、runtime 等 --><scope>compile</scope></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.1</version><scope>test</scope> <!-- 仅在测试阶段使用 --></dependency></dependencies><!-- build: 构建配置,如插件、资源等 --><build><plugins><plugin><!-- 编译插件 --><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><!-- 设置 Java 编译版本 --><source>1.8</source><target>1.8</target></configuration></plugin><plugin><!-- 测试报告生成插件 --><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>2.22.2</version></plugin></plugins></build><!-- properties: 项目属性,通常用来定义全局变量 --><properties><!-- Maven 编译器的 Java 源代码版本 --><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target></properties><!-- repositories: 自定义 Maven 仓库 --><repositories><repository><id>central</id><name>Maven Central Repository</name><url>https://repo.maven.apache.org/maven2</url></repository></repositories><!-- profiles: 定义构建配置的不同环境 --><profiles><profile><id>development</id><properties><!-- 开发环境专用属性 --><maven.compiler.source>11</maven.compiler.source></properties></profile><profile><id>production</id><properties><!-- 生产环境专用属性 --><maven.compiler.source>1.8</maven.compiler.source></properties></profile></profiles>
</project>
2.1、父POM(Parent POM)
父POM文件位于项目的根目录
,通常用于多模块
项目的配置。它包含公共
依赖项、插件版本、构建配置等,供子模块继承
。父POM可以被称为“聚合POM”或“根POM”,并且会定义<modules>
标签来指定所有子模块。
以下是一个详细的父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.0http://maven.apache.org/maven-v4_0_0.xsd"><!-- modelVersion: 定义 POM 文件的版本,通常为 4.0.0 --><modelVersion>4.0.0</modelVersion><!-- groupId: 定义父 POM 的组 ID --><groupId>com.example</groupId><artifactId>parent-project</artifactId><version>1.0.0</version><!-- packaging: 父 POM 一般使用 pom 作为打包类型 --><packaging>pom</packaging><!-- modules: 定义子模块 --><modules><module>module-one</module><module>module-two</module></modules><!-- properties: 定义共享的属性,用于子项目继承 --><properties><!-- 定义所有模块的全局 Java 编译器版本 --><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><!-- 项目版本定义,可供子模块继承使用 --><spring.version>5.2.9.RELEASE</spring.version><junit.version>4.13.1</junit.version></properties><!-- dependencyManagement: 用于管理子模块的依赖版本 --><dependencyManagement><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${spring.version}</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>${junit.version}</version><scope>test</scope></dependency></dependencies></dependencyManagement><!-- build: 配置构建相关信息 --><build><plugins><plugin><!-- maven-compiler-plugin 插件,用于设置编译器版本 --><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>${maven.compiler.source}</source><target>${maven.compiler.target}</target></configuration></plugin><plugin><!-- maven-surefire-plugin 插件,用于执行单元测试 --><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>2.22.2</version></plugin></plugins></build><!-- profiles: 用于定义不同环境下的构建配置 --><profiles><profile><id>development</id><properties><!-- 开发环境中使用 Java 11 --><maven.compiler.source>11</maven.compiler.source><maven.compiler.target>11</maven.compiler.target></properties></profile><profile><id>production</id><properties><!-- 生产环境中使用 Java 8 --><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target></properties></profile></profiles><!-- repositories: 定义自定义 Maven 仓库 --><repositories><repository><id>central</id><url>https://repo.maven.apache.org/maven2</url></repository></repositories>
</project>
2.3、超级POM(Super POM)
超级POM是Maven提供的默认全局
POM文件,所有的Maven项目都会隐式继承
这个超级POM。它是Maven的顶级POM
,定义了Maven项目构建的默认行为。即使项目没有显式指定任何父POM,它也会自动继承
超级POM中的基本设置。
超级pom定义在maven-model-builder.jar
中,如果想查看其定义,需要将jar包解压,解压后超级pom的完整路径为: maven 安装目录\lib\maven-model-builder-3.8.6.jar\org\apache\maven\model\pom-4.0.0.xml
,内容如下:
<?xml version="1.0" encoding="UTF-8"?><project><!-- 定义 POM 文件的版本,通常为 4.0.0 --><modelVersion>4.0.0</modelVersion><!-- repositories 元素定义 Maven 用于解析依赖的仓库 --><repositories><repository><!-- id 是仓库的唯一标识符,代表 Maven Central 仓库 --><id>central</id><!-- name 是仓库的名称,描述性字段 --><name>Central Repository</name><!-- url 定义了仓库的网络地址 --><url>https://repo.maven.apache.org/maven2</url><!-- layout 定义了仓库的布局,默认为 default --><layout>default</layout><snapshots><!-- 禁用从该仓库下载快照版本 --><enabled>false</enabled></snapshots></repository></repositories><!-- pluginRepositories 元素用于定义 Maven 插件的仓库 --><pluginRepositories><pluginRepository><!-- 插件仓库的唯一标识符,与普通仓库类似 --><id>central</id><!-- 仓库的名称 --><name>Central Repository</name><!-- 仓库的 URL 地址 --><url>https://repo.maven.apache.org/maven2</url><!-- 仓库的布局,默认值为 default --><layout>default</layout><snapshots><!-- 禁用快照版本的插件下载 --><enabled>false</enabled></snapshots><releases><!-- 定义如何更新发布版本的策略,never 表示从不更新 --><updatePolicy>never</updatePolicy></releases></pluginRepository></pluginRepositories><!-- build 元素定义了构建过程中的目录、插件和资源管理 --><build><!-- 定义编译输出的目录,通常为 target 文件夹 --><directory>${project.basedir}/target</directory><!-- 定义编译后的类文件的输出目录 --><outputDirectory>${project.build.directory}/classes</outputDirectory><!-- 定义构建输出文件的最终名称,通常包括 artifactId 和版本号 --><finalName>${project.artifactId}-${project.version}</finalName><!-- 定义测试编译后的输出目录 --><testOutputDirectory>${project.build.directory}/test-classes</testOutputDirectory><!-- Java 源代码的目录,默认为 src/main/java --><sourceDirectory>${project.basedir}/src/main/java</sourceDirectory><!-- 脚本源文件的目录 --><scriptSourceDirectory>${project.basedir}/src/main/scripts</scriptSourceDirectory><!-- 测试源代码的目录,默认为 src/test/java --><testSourceDirectory>${project.basedir}/src/test/java</testSourceDirectory><!-- 定义项目的主资源文件目录,通常用于配置文件等 --><resources><resource><directory>${project.basedir}/src/main/resources</directory></resource></resources><!-- 定义测试资源文件目录 --><testResources><testResource><directory>${project.basedir}/src/test/resources</directory></testResource></testResources><!-- pluginManagement 元素管理所有的插件版本和配置,供子项目继承 --><pluginManagement><!-- NOTE: 以下插件将在未来版本的超级 POM 中移除 --><plugins><!-- 定义了 maven-antrun-plugin 插件及其版本 --><plugin><artifactId>maven-antrun-plugin</artifactId><version>1.3</version></plugin><!-- 定义了 maven-assembly-plugin 插件及其版本,用于生成项目打包配置 --><plugin><artifactId>maven-assembly-plugin</artifactId><version>2.2-beta-5</version></plugin><!-- 定义了 maven-dependency-plugin 插件及其版本,管理项目依赖 --><plugin><artifactId>maven-dependency-plugin</artifactId><version>2.8</version></plugin><!-- 定义了 maven-release-plugin 插件及其版本,管理项目发布流程 --><plugin><artifactId>maven-release-plugin</artifactId><version>2.5.3</version></plugin></plugins></pluginManagement></build><!-- reporting 元素用于生成项目报告的输出目录 --><reporting><outputDirectory>${project.build.directory}/site</outputDirectory></reporting><!-- profiles 元素定义了项目的构建配置文件需要mvn clean install -DperformRelease=true才能生效--><profiles><!-- 定义一个 profile,名为 release-profile --><profile><id>release-profile</id><!-- activation 元素定义激活 profile 的条件 --><activation><!-- 当属性 performRelease 为 true 时激活此 profile --><property><name>performRelease</name><value>true</value></property></activation><build><plugins><!-- 继承自父 POM 的 maven-source-plugin 插件 --><plugin><inherited>true</inherited><artifactId>maven-source-plugin</artifactId><executions><execution><id>attach-sources</id><goals><!-- 生成源码 jar 包 --><goal>jar-no-fork</goal></goals></execution></executions></plugin><!-- 继承自父 POM 的 maven-javadoc-plugin 插件,用于生成 Javadoc --><plugin><inherited>true</inherited><artifactId>maven-javadoc-plugin</artifactId><executions><execution><id>attach-javadocs</id><goals><!-- 生成 Javadoc jar 包 --><goal>jar</goal></goals></execution></executions></plugin><!-- 继承自父 POM 的 maven-deploy-plugin 插件 --><plugin><inherited>true</inherited><artifactId>maven-deploy-plugin</artifactId><configuration><!-- 配置更新发布信息 --><updateReleaseInfo>true</updateReleaseInfo></configuration></plugin></plugins></build></profile></profiles></project>
也正是超级pom中build元素定义了构建过程中的源码文件
、配置文件等资源
的目录
,才有如下约定的目录要求。
2.4、有效POM(Effective POM)
有效POM(Effective POM)是Maven生成的最终POM文件
,它将项目POM文件与父POM、超级POM以及各种继承和聚合的配置组合在一起,形成一个完整的项目配置。有效POM包含了项目中所有继承的配置、依赖、插件等信息,即项目实际构建时使用的完整POM。
2.4.1、如何查看有效POM?
mvn help:effective-pom
示例输出:
<project><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>my-project</artifactId><version>1.0-SNAPSHOT</version><packaging>jar</packaging><build><plugins><plugin><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin><plugin><artifactId>maven-surefire-plugin</artifactId><version>2.22.2</version></plugin><plugin><artifactId>maven-jar-plugin</artifactId><version>3.1.0</version></plugin><!-- 其他插件 --></plugins></build><dependencies><!-- 列出所有依赖,包括直接声明的和继承来的 --></dependencies><!-- 其他配置 -->
</project>
如果使用mvn help:effective-pom命令时,输出的内容过多
导致最上面的部分被截断
,输出到文件并打开
。
- 在Linux或macOS中,执行以下命令可以将输出保存到文件后立即打开它
mvn help:effective-pom > effective-pom.xml && open effective-pom.xml
- 在Windows上可以使用
mvn help:effective-pom > effective-pom.xml && start effective-pom.xml
2.4.2、有效POM的用途
调试配置问题
:帮助你理解为什么某个依赖或插件会被使用,或者为何某个插件没有被使用查看默认插件
:帮助查看所有自动添加的插件和它们的版本验证继承和聚合
:确保项目继承了正确的配置,尤其是当项目使用多模块或父子POM时
三、Maven依赖管理
Maven依赖管理是Maven最强大
的功能之一,它通过自动下载和管理项目所需的外部库
和插件
,使开发者无需手动配置这些依赖项。
1、依赖范围
- 通过设置坐标的依赖范围,可以设置对应
jar
包的作用范围
编译环境
:在源代码的目录src/main/java
下可以使用测试环境
:在测试源代码的目录src/test/java
下可以使用运行环境
:生成的war或可执行jar的lib
下有对应的jar
1.1、compile(编译范围)
- 描述:默认
依赖范围
。所有没有明确指定范围的依赖,都会使用compile
范围 - 作用:在
编译
、测试
和运行
时均可用 - 使用场景:对于大多数核心库,如框架类库(例如 Spring),都应使用
compile
范围 - 示例:
<dependency><groupId>org.example</groupId><artifactId>example-lib</artifactId><version>1.0</version> </dependency>
1.2、provided(已提供范围)
- 描述:运行时需要由应用服务器或容器提供该依赖
- 作用:在
编译
和测试
时可用,但不会在运行时包含在打包文件中
- 使用场景:适用于需要在应用服务器或其他容器(如 Tomcat)中提供的依赖。例如,Servlet API 需要由 Web 服务器提供
- 示例:
<dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>4.0.1</version><scope>provided</scope> </dependency>
- 如图
tomcat
也就是部署的服务器本身就提供了
1.3、runtime(运行时范围)
- 描述:主要用于那些
不在编译阶段使用
,但需要在项目运行时加载的库 - 作用:在
运行
和测试
时可用,但不会在编译时使用 - 使用场景:JDBC驱动实现依赖,其在编译时只需JDK提供的JDBC接口,只有测试、运行阶段才需要实现了JDBC接口的驱动
- 示例:
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.25</version><scope>runtime</scope> </dependency>
1.4、test(测试范围)
- 描述:通常用于JUnit、TestNG等测试框架
- 作用:只在
测试环境
src/test/java下可用,编译和运行时不可用 - 使用场景:适用于所有测试相关的库,如测试框架
- 示例:
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope> </dependency>
1.5、system(系统范围)
- 描述:系统范围的依赖类似于
provided
,但它需要手动提供JAR文件,并通过systemPath
明确指明依赖的路径 - 作用:在
编译
和测试
时可用,但不会在运行时包含。(project.basedir
是maven的预定义变量,表示当前项目的根目录路径
) - 使用场景:适用于系统自带的库,或需要本地使用的特定
JAR
文件 - 打包插件配置
<includeSystemScope>true</includeSystemScope>
,否则可执行jar中lib没有此依赖 - 示例:
<dependency><groupId>com.xc.maven</groupId><artifactId>xc-maven-test</artifactId><version>1.0-SNAPSHOT</version><systemPath>${project.basedir}/src/main/resources/lib/open-api-sdk-2.0.jar</systemPath><scope>system</scope></dependency><!--配合打包插件配置--><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><includeSystemScope>true</includeSystemScope></configuration></plugin></plugins></build>
1.6、import(导入范围)
- 描述:
import
是一种特殊的依赖范围,通常在依赖管理(<dependencyManagement>
)中使用,用来导入POM类型的依赖。通过import
,可以将另一个POM中定义的依赖管理配置应用到当前项目中 - 作用:
引入
另一项目的依赖配置,不直接应用于编译、测试或运行时 - 使用场景:在一个父pom中的dependencyManagement标签中需要导入另一个pom中的dependencyManagement的时候
<type>
元素用于指定依赖的打包类型
,默认依赖是.jar
文件,是最常见的依赖类型- 示例:
<dependencyManagement><dependency><groupId>org.example</groupId><artifactId>example-dependencies</artifactId><version>1.0</version><type>pom</type><scope>import</scope></dependency> </dependencyManagement>
<type>单独使用的场景
- 指定依赖的类型为POM,表明这是一个POM文件,而不是一个实际的库
- 这个配置用于将指定POM文件中的
依赖管理
或其他配置
引入到当前项目中
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.7.11</version><type>pom</type></dependency>
</dependencies>
2、依赖传递
假设项目A依赖于库B,而库B依赖于库C,那么当你在项目A中声明依赖库B时,Maven会自动为你将库C也加入到A的类路径中。这就是依赖传递
的效果,Maven会递归解析每个依赖的依赖
。
2.1、依赖传递的作用范围
Maven支持不同的依赖范围(scope)
,依赖传递
的行为会受到这些范围的影响。以下是各范围在依赖传递中的行为:
作用范围 | 传递性 | 原因 |
---|---|---|
compile | 是 | 默认范围,可在编译、运行和测试时使用,传递性强 |
provided | 否 | 仅在编译和测试时使用,不会在运行时加入,传递性关闭 |
runtime | 是 | 仅在运行时使用,编译时不可用,传递性仍然保留 |
test | 否 | 仅在测试时使用,不会传递给其他模块 |
system | 否 | 需要手动指定的外部依赖,不能传递 |
import | 仅导入依赖管理 | 仅用于导入依赖管理,不导入具体依赖 |
2.2、可选依赖
当你为某个依赖指定<optional>true</optional>
时,这个依赖就不会自动传递给下游的依赖(即其他依赖这个项目的项目)。一句话,阻止
依赖传递。
<!--热部署依赖 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional>
</dependency>
2.3、依赖冲突与版本控制
Maven通过依赖传递机制可能会引入多个不同版本的同一个库,这时就会发生依赖冲突
。
依赖冲突优先级规则
-
首要判断:
最短路径优先
-
再者判断:路径相同时
先声明者优先
依赖冲突手动排除
- 在对依赖冲突默认规则生效的版本不满意时候,可以自己选择手动排除
<dependency><groupId>com.xc</groupId><artifactId>project2</artifactId><version>1.0-SNAPSHOT</version><scope>compile</scope><!-- 使用excludes标签配置依赖的排除 --><exclusions><!-- 在exclude标签中配置一个具体的排除 --><exclusion><!-- 指定要排除的依赖的坐标(不需要写version) --><groupId>com.xc</groupId><artifactId>project3</artifactId></exclusion></exclusions>
</dependency>
四、Maven工程构建
项目构建是指将源代码、依赖库和资源文件
等转换成可执行或可部署的应用程序
的过程,在这个过程中包括编译源代码、链接依赖库、打包和部署等多个步骤。
1、生命周期
Maven的生命周期(Lifecycle)是构建项目的步骤集合
,定义了从项目编译到部署的一系列过程。
下面是Maven生命周期及其阶段的表格:
生命周期 | 阶段 | 描述 |
---|---|---|
Clean 生命周期 | pre-clean | 执行清理之前的工作 |
clean(重点) | 移除上一次构建生成的文件 | |
post-clean | 执行清理之后的工作 | |
Default 生命周期 | validate | 验证项目结构和必要信息 |
initialize | 初始化构建状态,例如设置属性 | |
generate-sources | 生成源代码(如果需要) | |
process-sources | 处理源代码(如代码增强) | |
generate-resources | 生成资源文件 | |
process-resources | 复制并处理资源到输出目录,准备打包 | |
compile(重点) | 编译项目main目录下的源代码 | |
process-classes | 处理编译后的类文件 | |
generate-test-sources | 生成测试源代码 | |
process-test-sources | 处理测试源代码 | |
generate-test-resources | 生成测试资源 | |
process-test-resources | 处理测试资源 | |
test-compile | 编译测试代码 | |
test(重点) | 运行测试代码 | |
prepare-package | 打包前的准备工作 | |
package(重点) | 将编译结果打包(如 JAR、WAR) | |
pre-integration-test | 运行集成测试前的准备工作 | |
integration-test | 运行集成测试 | |
post-integration-test | 集成测试后的清理工作 | |
verify | 验证项目是否符合标准 | |
install(重点) | 安装包到本地仓库 | |
deploy(重点) | 将包发布到远程仓库 | |
Site 生命周期 | pre-site | 生成站点之前的准备工作 |
site | 生成项目站点文档 | |
post-site | 生成站点之后的处理工作 | |
site-deploy | 发布生成的站点到服务器 |
生命周期独立
:clean、default和site生命周期彼此独立,执行一个生命周期时,不会自动触发其他生命周期阶段顺序执行
:在一个生命周期内,Maven从最初阶段开始执行,依次运行到你指定的阶段。如果指定了一个中间阶段,之前的所有阶段都会被执行,确保构建流程的完整性和一致性
2、构建命令
需要在包含pom.xml
的项目根目录执行Maven构建命令,因为Maven是基于这个文件来读取构建配置、依赖和插件信息的。
命令 | 描述 |
---|---|
mvn compile | 编译项目,生成target文件 |
mvn package | 打包项目,生成jar或war文件 |
mvn clean | 清理编译或打包后的项目结构 |
mvn install | 打包后上传到maven本地仓库 |
mvn deploy | 只打包,上传到maven私服仓库 |
mvn site | 生成站点 |
mvn test | 执行测试源码 |
2.1、常见组合命令
mvn clean install
:清理项目后,重新构建并将包安装到本地仓库mvn clean package
:清理项目后,重新生成可分发的包(如 JAR 或 WAR)
2.2、命令选项
-DskipTests
:跳过测试,例如:mvn clean install -DskipTests-X
:启用详细的调试日志信息,例如:mvn clean install -X-T 1C
:使用多线程构建,1C表示使用与CPU核数相同的线程数,例如:mvn clean install -T 1C
3、插件
Maven插件是执行项目构建和管理的实际工具
。所有的构建任务(例如编译、测试、打包、部署等)都是由插件来执行的
。Maven本身是一个框架,它通过插件来调用具体的功能。
3.1、Maven默认的插件
maven-compiler-plugin
:用于编译源代码。默认Java1.5
版本,可以通过配置更改为其他版本
方式一:并设置source和target版本
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version> <!-- 插件版本 --><configuration><source>1.8</source> <!-- 指定源代码使用的Java版本 --><target>1.8</target> <!-- 指定生成字节码的Java版本 --></configuration>
</plugin>
方式二:使用properties
设置全局Java版本
<!-- properties: 项目属性,通常用来定义全局变量 -->
<properties><!-- Maven 编译器的 Java 源代码版本 --><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target>
</properties>
maven-surefire-plugin
:用于运行单元测试,主要是通过 JUnit 或 TestNGmaven-jar-plugin
:用于创建jar文件。默认把编译后的class文件打包为一个jar文件(只是一个标准的库 JAR,不包含所有的依赖项)maven-install-plugin
:用于把生成的工件(JAR、WAR 文件等)安装到本地Maven仓库maven-deploy-plugin
:用于将工件发布到远程仓库,供其他开发人员使用- maven-site-plugin:用于生成站点文档,通常基于项目的POM文件信息生成报告和文档
maven-clean-plugin
:用于清除项目生成的文件,例如target目录下的编译输出- maven-resources-plugin:用于处理项目中的资源文件(如将资源从
src/main/resources
复制到目标目录)
从idea可视化工具查看maven的默认插件:
3.2、生成微服务可运行jar包
由以上插件maven-jar-plugin可知,默认情况只能生成依赖jar,而不是微服务可执行的jar,一般使用SpringBoot插件spring-boot-maven-plugin
,这个插件负责打包微服务为一个可运行的jar包。
<!-- SpringBoot应用打包插件-->
<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins>
</build>
3.2.1、添加spring-boot-maven-plugin插件后的打包流程
- 第一步:打包生成普通JAR
- Maven会使用默认打包插件maven-jar-plugin生成一个普通的JAR文件
- 标准JAR文件,不可执行,用于依赖作为库或被引用
- 第二步:生成可执行JAR
- 将第一步生成的JAR文件重命名为
xxx.jar.original
文件 - repackage命令会将应用的所有依赖项(包括嵌入式的 Tomcat、Jetty 或其他服务器)打包进JAR中,并且指定JAR的入口点(即 Main-Class)
- 可执行的JAR,包含所有依赖和嵌入式服务器,能够独立运行
- 将第一步生成的JAR文件重命名为
3.2.2、常规打包方式
pom文件:
...<groupId>com.xc</groupId><artifactId>springboot-mybatis</artifactId><version>1.0-SNAPSHOT</version>
...<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
打包结果:
springboot-mybatis-1.0-SNAPSHOT.jar
- 命名: artifactId + 版本号,用“-”连接
- 可以使用java -jar xxx直接运行的服务,里面包含依赖的jar
springboot-mybatis-1.0-SNAPSHOT.jar.original
- 去掉后缀.original则是可以被其他项目依赖的jar
3.2.3、进阶打包方式
pom文件:
...<groupId>com.xc</groupId><artifactId>springboot-mybatis</artifactId><version>1.0-SNAPSHOT</version>
...<build><finalName>my-mybatis</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><classifier>exec</classifier><skip>false</skip></configuration></plugin></plugins></build>
打包结果:
my-mybatis.jar
:依赖jar,不可执行my-mybatis-exec.jar
:可执行依赖- <finalName>标签:设置
打包的名称
,不再使用artifactId + 版本号方式 - <classifier>标签:设置可运行服务
jar的后缀
- 因为可运行jar有了后缀
- 所有依赖jar就不会重名,也就不用添加后缀.original
- <skip>标签:mavn执行插件选择是否跳过,默认false,true则不执行当前插件
3.3、<resources>标签
不写<resources>标签
src/main/java
下非java
文件都不会编译- target当中的classes和打出的包解压BOOT-INF当中的classes都找不到
src/main/resources
下的文件都会被编译- target当中的classes和打出的包解压BOOT-INF当中的classes都可以找到
<resources>标签只设置src/main/java
- 假如代码中有xml想加载编译,添加如下
<build><resources><resource><directory>src/main/java</directory><filtering>true</filtering><includes><include>**/*.xml</include></includes></resource></resources>
</build>
- <filtering>标签:默认值为false。指定打包时的配置文件其中${}引用会换成直接引用
- 此时src/main/java中的xml会编译,但是src/main/resource中的所有资源都没有加载
- 可以理解为:
- 不加<resource>则默认只加载resource文件
- 添加<resource>则是加哪个路径,只加载哪个路径的文件
最终方案
- 如此,java和resources下需要的资源都会加载
<build><resources><resource><directory>src/main/java</directory><filtering>true</filtering><includes><include>**/*.xml</include></includes></resource><resource><directory>src/main/resources</directory><filtering>true</filtering></resource></resources>
</build>
Maven生命周期、命令、插件之间的关系
Maven的生命周期
定义了项目构建的步骤,每个阶段通过绑定的插件目标
执行具体任务。命令
用于触发生命周期的某个阶段或直接调用插件目标。三者通过插件绑定阶段、命令触发生命周期,协同完成项目的自动化构建。
五、Maven继承和聚合
1、继承
Maven工程之间,A工程继承B工程。本质上是A工程的pom.xml
中的配置继承了B工程中pom.xml的配置
1.1、父项目的pom.xml
- 父项目是作为顶层项目,包含多个子项目的
通用配置
。父项目的打包类型是pom
- 使用
dependencyManagement
标签配置只对依赖的管理,不导入
<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-SNAPSHOT</version><packaging>pom</packaging><properties><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target></properties><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version></plugin></plugins></build><dependencyManagement><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>5.3.9</version></dependency></dependencies></dependencyManagement>
</project>
1.2、子项目pom.xml
- 子项目通过在pom.xml中使用
<parent>
标签指定父项目,从而继承父项目的配置 - 子项目可以
继承
父项目的依赖、插件、属性等,也可以在子项目中覆盖
父项目的配置 - 如果子工程坐标中的
groupId
和version
与父工程一致,那么可以省略
<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-SNAPSHOT</version><relativePath>../parent-pom.xml</relativePath> <!-- 相对路径 --></parent><artifactId>child-project</artifactId><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId></dependency></dependencies>
</project>
1.2.1、<relativePath>标签
<relativePath>
标签用于在子项目的pom.xml中指定父项目的相对路径- 如果父项目位于子项目上一级目录,通常不需要显式指定
<relativePath>
,Maven会默认使用../pom.xml
- 在非标准目录结构或父项目位于远程仓库时,使用
<relativePath/>
忽略远程父项目
2、聚合
Maven聚合是通过在一个主项目的pom.xml文件中使用<modules>
标签定义多个子模块来实现的。聚合项目本身的pom.xml文件不会直接生成可执行文件,而是负责将多个子模块集中构建
。
聚合项目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-SNAPSHOT</version><packaging>pom</packaging><!-- 列出所有模块 --><modules><module>module-a</module><module>module-b</module><module>module-c</module></modules>
</project>
在这个例子中,聚合项目parent-project聚合了三个子模块module-a、module-b和module-c。通过运行聚合项目的mvn install
或mvn clean install
命令,可以一次性构建
这三个子模块。
五、Maven仓库
1、Maven仓库
Maven仓库(Maven Repository)是用于存储
和管理
Maven项目构建过程中所需的依赖库
、插件
以及构件的存储库。
1.1、本地仓库(Local Repository)
本地仓库位于开发者的本地
机器上,存储Maven构建过程中下载的所有依赖和插件。当项目构建时,Maven 首先会检查本地仓库中是否已经存在需要的依赖,如果没有,则会从远程仓库或中央仓库下载。
- 默认路径:
~/.m2/repository
- 特性:缓存下载的依赖,减少重复下载,提高构建速度
settings.xml文件修改本地仓库地址
,将中央仓库地址替换为阿里云Maven仓库
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0http://maven.apache.org/xsd/settings-1.0.0.xsd"><localRepository>/path/to/your/repo</localRepository><mirrors><mirror><id>aliyun-maven</id><mirrorOf>central</mirrorOf><name>Aliyun Maven Repository</name><url>https://maven.aliyun.com/repository/public</url><layout>default</layout></mirror></mirrors><!-- 其他配置 -->
</settings>
1.2、中央仓库(Central Repository)
中央仓库是Maven官方维护的公共仓库,存储了开源项目常用的依赖库。它是Maven的默认远程仓库,当本地仓库中没有找到某个依赖时,Maven会自动从中央仓库下载。
- 中央仓库地址:
https://repo.maven.apache.org/maven2
- 特性:全球公开访问,涵盖了大量开源项目的库和插件
1.3、远程仓库(Remote Repository)
远程仓库是除了中央仓库
,任何其他的远程仓库,包括第三方仓库
和私有仓库
。
- 其中,远程仓库可以分为两种子类型:
快照仓库(Snapshot Repository)
:用于存储开发中的快照版本,支持不断更新发布仓库(Release Repository)
:用于存储稳定的已发布版本,内容不会改变
1.4、Maven仓库的工作原理
本地仓库查找
:Maven 首先从本地仓库查找构建所需的依赖和插件远程仓库下载
:如果本地仓库没有该依赖,Maven 会从配置的远程仓库或中央仓库下载该依赖,并存储到本地仓库中依赖缓存
:一旦依赖下载到本地仓库,后续构建中无需再次下载,除非依赖的版本发生变化(如 SNAPSHOT版本)发布到仓库
:开发人员可以将构件(如打包的JAR文件)发布到远程仓库(如企业私有仓库),供其他团队成员或项目共享使用
2、Maven私服
Maven私服是一种特殊的Maven远程仓库
,它是架设在局域网
内的仓库服务,用来代理位于外部的远程仓库(中央仓库、其他远程公共仓库)。
以下是搭建 Maven 私服常用的工具:
Nexus Repository Manager
:由Sonatype提供的开源仓库管理器(当前最流行、使用最广泛)Artifactory
:Jfrog提供的仓库管理工具,支持多种格式的包管理(包括 Maven)Apache Archiva
:Apache提供的开源工具,专注于Maven仓库管理
2.1、Nexus仓库
仓库类型 | 说明 |
---|---|
proxy | 代理仓库 :用于从远程存储库获取组件 |
group | 组仓库 :它将多个仓库聚合为一个访问入口,可以一并访问多个底层仓库 |
hosted | 托管仓库 :用于存储由内部开发者创建的jar包 |
maven-central
:代理了远程的Maven中央仓库,构建项目时会从该仓库下载依赖
maven-public
:一个组仓库,聚合了多个仓库的内容- 它将
多个仓库
整合成一个统一的入口
,便于开发者访问 - 在这个组中,通常包含
maven-releases
、maven-snapshots
和maven-central
等仓库 - 那么只需要配置一个maven-public仓库,就能同时访问这些托管的和代理的仓库
- 它将
maven-releases
:专门用于存储发布的版本(release versions)的构件- 当一个项目发布了
稳定的版本(非SNAPSHOT)
,可以将这些构件发布到maven-releases仓库中 - 其他团队成员或相关项目可以直接从这个仓库下载发布的版本
- 当一个项目发布了
maven-snapshots
:专门用于存储开发中的SNAPSHOT版本的构件- SNAPSHOT版本代表开发中的构件,它们可能会频繁更新,不像release版本那样稳定
- 每次构建的SNAPSHOT版本都会
覆盖
先前版本,而不是生成新的版本号
2.2、通过Nexus下载jar包
- 修改
settings.xml
<mirrors><mirror><id>nexus-mirror</id> <!-- 这是镜像仓库的唯一标识符,不用于认证 --><mirrorOf>central</mirrorOf> <!-- 重定向中央仓库的请求 --><url>http://your-nexus-repo-url/repository/maven-public/</url></mirror>
</mirrors><servers><server><id>nexus-mirror</id> <!-- 如果上面仓库需要认证,这个ID必须与上面id一致 --><username>your-username</username><password>your-password</password></server>
</servers>
- url标签的来源
- 本地仓库下载完包以后,nexus的组仓库
maven-public
就能看见jar包了
- 若下载速度太慢,可以设置私服中中央仓库的地址为
阿里云仓库地址
2.3、将jar包部署到Nexus
步骤 1:在pom.xml中配置发布仓库
- 一个用于发布
正式的release版本
,另一个用于发布snapshot(快照)版本
<distributionManagement><repository><id>nexus-releases</id> <!-- 正式发布仓库的 ID --><url>http://your-nexus-repo-url/repository/maven-releases/</url> <!-- Nexus Releases 仓库的 URL --></repository><snapshotRepository><id>nexus-snapshots</id> <!-- 快照仓库的 ID --><url>http://your-nexus-repo-url/repository/maven-snapshots/</url> <!-- Nexus Snapshots 仓库的 URL --></snapshotRepository>
</distributionManagement>
步骤 2:在 settings.xml 中配置认证信息
- 为
distributionManagement
中的仓库id添加相应的认证信息
<servers><server><id>nexus-releases</id> <!-- 对应 pom.xml 中的 repository ID --><username>your-username</username><password>your-password</password></server><server><id>nexus-snapshots</id> <!-- 对应 pom.xml 中的 snapshotRepository ID --><username>your-username</username><password>your-password</password></server>
</servers>
- 上传成功
3、repositories和mirrors
3.1、repositories(仓库)
repositories
是Maven用于查找和下载项目依赖的远程或本地存储库
。Maven在构建项目时,会从这些仓库中查找所需的依赖(如 JAR 包)并下载到本地存储库。
主要功能
- 定义Maven用来查找项目依赖的存储库位置
- 可以在
pom.xml
中为每个项目单独配置,也可以在settings.xml
中全局配置
示例
在 pom.xml
中定义仓库:
<repositories><repository><id>company-repo</id> <!-- 仓库的唯一 ID,用于认证等 --><url>http://your-company-repo-url/repository/maven-releases/</url> <!-- 仓库 URL --><releases><enabled>true</enabled> <!-- 指定是否用于发布版本 --></releases><snapshots><enabled>false</enabled> <!-- 指定是否用于快照版本 --></snapshots></repository>
</repositories>
3.2、mirrors(镜像)
mirrors
用于对某个特定仓库(如Maven中央仓库)的请求重定向
到另一个仓库(如公司内部的Nexus仓库)。它的主要作用是将对中央仓库、快照仓库等的请求重定向到另一个地方。
主要功能
- 当Maven请求中央仓库时,它会自动将请求转发到定义的镜像仓库,而不需要手动配置每个项目的
repositories
- 配置在
settings.xml
中(而不是pom.xml
),适用于全局配置
示例
在 settings.xml
中定义镜像:
<mirrors><mirror><id>nexus-mirror</id> <!-- 镜像仓库的唯一标识符 --><mirrorOf>central</mirrorOf> <!-- 指定要镜像的仓库,如 Maven 中央仓库 --><url>http://your-company-repo-url/repository/maven-public/</url> <!-- 镜像仓库的 URL --></mirror>
</mirrors>
id
:为镜像指定的唯一标识符。它可以是任意值,用于区分不同的镜像配置mirrorOf
:定义要镜像的仓库。常见的值包括:central
:表示Maven中央仓库
*
:表示镜像所有仓库
repo1,repo2
:表示镜像多个指定的仓库
!central
:表示镜像所有仓库,除了中央仓库
url
:镜像仓库的实际URL,Maven将通过这个URL下载依赖
相关文章:

Maven入门到进阶:构建、依赖与插件管理详解
文章目录 一、Maven介绍1、什么是Maven2、Maven的核心功能 二、Maven核心概念1、坐标GAVP1.1、GroupId1.2、ArtifactId1.3、Version1.3.1、版本号的组成 1.4、Packaging 2、POM、父POM和超级POM2.1、POM (Project Object Model)2.1、父POM(Parent POM)2.…...

炒股VS炒游戏装备,哪个更好做
这个项目,赚个10%都是要被嫌弃的 虽然天天都在抒发自己对股市的看法,但自己自始至终也没有买进任何一支股票。之所以对这个话题感兴趣,着实是因为手上的游戏搬砖项目也是国际性买卖,跟国际形势,国际汇率挂钩࿰…...

AI图像处理工具:开发者高阶用法与最佳实践
引言 随着人工智能技术的迅猛发展,AI图像处理工具正日益成为开发者工作流程中不可或缺的一部分。这些工具不仅能有效处理图像,还能通过深度学习模型实现复杂的图像理解和生成任务。本文将深入探讨开发者在使用AI图像处理工具时的高阶用法,提…...

Spring Boot 2.6=>2.7 升级整理
版本变更: 1、SpringBootTest 属性源优先级:使用 SpringBootTest 注解的测试现在将命令行属性源置于测试属性源之上 在 Spring Boot 2.7 及更高版本中,对 SpringBootTest 的属性源优先级进行了调整,使得通过命令行传递的属性&am…...

Race Track Generator Ultimate:Race Track Generator(赛车场赛道看台场景创建工具)
下载:Unity资源商店链接资源下载链接 效果图:...

数据结构7——二叉树的顺序结构以及堆的实现
在上篇文章数据结构6——树与二叉树中,我们了解了树和二叉树的概念,接着上篇文章,在本篇文章中我们学习二叉树顺序结构的实现。 目录 1. 二叉树的顺序存储结构 2. 堆的概念及结构 1. 堆的概念 2. 堆的结构 3. 堆的实现 1. 堆节点 2. 交…...

leetcode hot100 之【LeetCode 21. 合并两个有序链表】 java实现
LeetCode 21. 合并两个有序链表 题目描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接两个链表的节点组成的。 示例 1: 输入:l1 [1,2,4], l2 [1,3,4] 输出:[1,1,2,3,4,4]示例 2: 输入:l1 …...

Android Camera系列(五):Camera2
Life was like a box of chocolates, you never know what you’re gonna get. 生命就像一盒巧克力,你永远无法知道下一个是什么味道的。 Android Camera系列(一):SurfaceViewCamera Android Camera系列(二࿰…...
从DexMV、VideoDex、MimicPlay到SeeDo:从人类视频中学习:机器人的主流训练方法之一
前言 在此文《UMI——斯坦福刷盘机器人:从手持夹持器到动作预测Diffusion Policy(含代码解读)》的1.1节开头有提到 机器人收集训练数据一般有多种方式,比如来自人类视频的视觉演示 有的工作致力于从视频数据——例如YouTube视频中进行策略学习 即最常见…...

如何在Docker中运行Squid
测试环境 VMware Rocky Linux 9.4 实现步骤 过程:写一个Dockerfile构建Squid镜像; 再写一个启动脚本start_squid.sh,在启动脚本中配置并运行Squid。 编写Dockerfile 以rockylinux9.3做基础镜像,通过yum安装Squid, 拷贝squid.conf FROM …...

Ubuntu22.04 加入AD域
Ubuntu22.04 加入AD域 要在Ubuntu 22.04上加入Active Directory (AD) 域,你可以使用realmd和sssd服务。以下是加入AD域的步骤和示例配置: 更新系统软件包列表: sudo apt update 下载安装必要的软件包: sudo apt install realm…...

Docker 构建 Miniconda3 Python 运行环境实战指南
Docker 构建 Miniconda3 Python 运行环境实战指南 文章目录 Docker 构建 Miniconda3 Python 运行环境实战指南一 准备 environment.yml二 获取项目 pip 信息三 Dockerfile 编写四 构建多平台镜像1 准备组件2 构建镜像3 导出镜像4 导入镜像 五 注意事项 本文详细介绍了如何通过 …...

029 elasticsearch文档管理(ElasticsearchRepository、ElasticsearchRestTemplate)
文章目录 BlogRepository.javaBlogRepositoryTest.javaBulkTest.java 文档的管理 ElasticSearchRepository接口 使用方法: 创建一个接口,继承于ElasticSearchRepository,指定使用的Entity类及对应主键数据类型 Springboot自动扫描接口并创建代…...

【Flutter】Dart:Isolate
在 Dart 和 Flutter 中,所有的代码默认都运行在单一的线程(即主线程)上,这个线程也叫做 UI 线程。当进行耗时操作(如复杂计算或网络请求)时,如果不使用多线程处理,主线程会被阻塞&am…...

微信小程序 页面间传递数据
在小程序中,给页面传递参数通常有以下几种方法: 通过URL传递参数: 在小程序中,可以在页面的路径后面添加参数,然后在页面的 onLoad 函数中获取这些参数。 // 在app.json中配置页面路径 "pages": [{"pat…...

前端_005_Nodejs
文章目录 npm包管理器cjs和mjsYarn包管理器 1.Node.js 是js的一个运行环境,从nodejs诞生后js代码不局限于只在浏览器中执行,此外还能再nodejs里写服务端,用js可以前后端全栈开发 2.Node.js不跟浏览器一样默认含有document,window对象…...

SpringCache缓存介绍
1.为什么需要缓存 前台请求,后台先从缓存中取数据,取到直接返回结果,取不到时从数据库中取,数据库取到更新缓存,并返回结果,数据库也没取到,那直接返回空结果: 使用缓存是一个很…...

python实战(一)——iris鸢尾花数据集分类
一、任务背景 本文是python实战系列专栏的第一篇文章,我们将从分类开始由浅入深逐步学习如何使用python完成常规的机器学习/深度学习任务。iris数据集是经典的机器学习入门数据集,许多分类任务教程都会以这个数据集作为示例,它的数据量是150条…...

k8s-对命名空间资源配额
对k8s命名空间限制的方法有很多种,今天来演示一下很常用的一种 用的k8s对象就是ResourceQuota 一:创建命名空间 kubectl create ns test #namespace命名空间可以简写成ns 二: 对命名空间进行限制 创建resourcequota vim resourcequ…...

Failed to connect to github.com port 443
git push无法连接443端口 **问题1****方法一:取消代理设置**git命令 其他解决方案1. **设置 Git 使用 HTTP 而不是 HTTPS**2. **检查证书**3. **配置 Git 忽略 SSL 验证(不推荐)**4. **检查代理设置** 问题1 Failed to connect to github.com…...

【设计模式系列】简单工厂模式
一、什么是简单工厂模式 简单工厂模式(Simple Factory Pattern)是一种设计模式,其中包含一个工厂类,根据传入的参数不同,返回不同类的实例。这个工厂类封装了对象的创建逻辑,使得客户端代码可以从直接创建…...

给定一个正整数n随机生成n个字节即生成2n个十六进制数将其组成字符串返回secrets.token_hex(n)
【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 给定一个正整数n 随机生成n个字节 即生成2n个十六进制数 将其组成字符串返回 secrets.token_hex(n) [太阳]选择题 根据题目代码,执行的结果错误的是? import secrets …...

[Gtk] 工程
MediaPlayer 可执行文件工程 结构 . ├── BUILD ├── ButtonHelper.cpp ├── ButtonHelper.h ├── CMakeLists.txt ├── DrawingAreaHelper.cpp ├── DrawingAreaHelper.h ├── layout.ui └── main.cpp CMakeLists.txt # 1) cmake basic cmake_minimum_r…...

基于Multisim的汽车尾灯控制电路设计与仿真
假设汽车尾部左右量测各有3个指示灯(用发光二极管模拟)1. 汽车正常运行时指示灯全灭;2.右转弯时,右侧3个指示灯按右循环顺序点亮;.3. 左转弯时,左侧3个指示灯按左循环顺序点亮;4.临时刹车时所有…...

Leetcode 3326. Minimum Division Operations to Make Array Non Decreasing
Leetcode 3326. Minimum Division Operations to Make Array Non Decreasing 1. 解题思路2. 代码实现 题目链接:3326. Minimum Division Operations to Make Array Non Decreasing 1. 解题思路 这一题的话就是要看出来题中给出的operation的本质事实上就是将任意…...

redo文件误删除后通过逻辑备份进行恢复
问题描述 开发同事让在一个服务器上查找下先前库的备份文件是否存在,如果存在进行下恢复。翻了服务器发现备份文件存在,多愁了一眼竟翻到了该备份文件于2024.6.17日恢复过的日志,赶紧和开发沟通说2024.6.17号已经恢复过了为啥还要恢复&#x…...

7805的输出电压如何调整?
7805稳压集成电路的输出电压通常是固定的,标称为5V。然而,在实际应用中,可以通过一些方法调整其输出电压,尽管这些调整方法可能会使电路变得更加复杂或需要额外的元件。以下是几种可能的调整方法: 1. 使用不同型号的稳…...

git命令使用一览【自用】
git常见操作: git initgit remote add master【分支名字】 gitgits.xxxxx【仓库中获取的ssh链接或者http协议的链接】检查远程仓库是否链接成功。 git remote -v出现以下画面就可以git pull,git push了...

MES系列-报表和分析
MES系列-报表和分析 MES系列文章目录 ISA-95制造业中企业和控制系统的集成的国际标准-(1) ISA-95制造业中企业和控制系统的集成的国际标准-(2) ISA-95制造业中企业和控制系统的集成的国际标准-(3) ISA-95制造业中企业和控制系统的集成的国际标准-(4) ISA-95制造业中企业和控制…...

如何在分布式环境中实现高可靠性分布式锁
目录 一、简单了解分布式锁 (一)分布式锁:应对分布式环境的同步挑战 (二)分布式锁的实现方式 (三)分布式锁的使用场景 (四)分布式锁需满足的特点 二、Redis 实现分…...