自己总结的一些Maven使用上的细节

前言

可能有错误欢迎指正

依赖范围

依赖范围

支持运行的只有:默认的compile与runtime
支持打包的只有:默认的compile与runtime
不同依赖范围主要是来决定是否参与编译
测试都支持

compile(默认)
含义:compile 是默认值,如果没有指定 scope 值,该元素的默认值为 compile。被依赖项目需要参与到当前项目的编译测试打包运行等阶段。打包的时候通常会包含被依赖项目。
provided(编译、测试)
含义:被依赖项目理论上可以参与编译测试等阶段,相当于compile,但是再打包阶段做了exclude的动作。
适用场景:例如, 如果我们在开发一个web 应用,在编译时我们需要依赖 servlet-api.jar,但是在运行时我们不需要该 jar 包,因为这个 jar 包已由应用服务器提供,此时我们需要使用 provided 进行范围修饰。
runtime(测试和运行,以及打包)
含义:表示被依赖项目无需参与项目的编译,但是会参与到项目的测试运行。与compile相比,被依赖项目无需参与项目的编译。
适用场景:例如,在编译的时候我们不需要 JDBC API 的 jar 包,而在运行的时候我们才需要 JDBC 驱动包。
test(测试)
含义: 表示被依赖项目仅仅参与测试相关的工作,包括测试代码的编译,执行。
适用场景:例如,Junit 测试。
system(编译、测试)
含义:system 元素与 provided 元素类似,但是被依赖项不会从 maven 仓库中查找,而是从本地系统中获取,systemPath 元素用于制定本地系统中 jar 文件的路径。

关于范围测试、运行时说明

运行时提供:主程序运行时、测试程序运行时提供
测试时提供:测试程序编译时提供、测试程序运行时提供

另外以runtime为例,编译时不需要、运行时需要的意思是:
编译时IDE仅仅检查语法是否正确(使用一个接口后即使接口没有实现类)。运行时通过反射的方式(注入依赖范围为运行的依赖来)创造接口实现类

依赖范围传递

项目之间出现依赖关系,且各项目的依赖级别不一样
依赖范围传递

maven下载依赖的优先级

下载依赖的顺序是
本地仓库---->私服---->镜像----->中央仓库
(配置镜像后会跳过私服,本地仓库---->镜像----->中央仓库(配置完所有仓库的镜像也包含私服仓库))
(如果一个仓库下载过慢会自动切换到下个仓库下载,且remote文件也会变成下个仓库)

maven配置文件优先级

项目配置文件 -> 用户配置文件(idea的覆盖文件以及.m2下的配置文件) -> maven目录配置文件

maven版本

release:完成版
snapshot:开发版

有些仓库依赖有配置type标签的含义

依赖type不写(以及有其它依赖传递过来的),默认寻找jar包依赖

maven文件命名

maven文件命名

maven配置文件并不会全部覆盖

没有的功能不同配置文件会组合追加

生命周期与插件

执行生命周期操作:会把该生命周期之前的全部执行
执行插件操作:如果该插件的功能不是这个生命周期(未编译就install)则不允许执行插件,插件是执行这个阶段的操作

mavenPom的Parent标签查找顺序

有relativePath时

relativePath标签指向的路径。

无relativePath时

1.默认的relativePath路径"../"。(../pom.xml 只隔一层可以省略)
2.本地maven仓库。
3.远程maven仓库。

父工程含义

父工程含义

maven聚合与继承

聚合:(聚合管理)

子pom配置父pom后,父pom设置modules来管理子pom(安装一同安装等)

继承:(继承依赖、继承版本)

1.继承父POM设置的依赖版本、以及参数设置:
子pom配置parent后(继承父pom中设置的依赖版本) 超级POM
2.继承父依赖的依赖:
若父POM设置dependency,子POM在设置了parent标签后,即使子POM没有dependency父POM,也会继承父POM的依赖(没有设置dependencyManager的情况下也可以通过该方式控制依赖版本)

依赖传递:

依赖一个项目后,该依赖需要的依赖也会传递过来

maven超级pom位置

D:\apache-maven-3.0.4\lib 下的 maven-model-builder-3.0.4.jar 中的 org/apache/maven/model/pom-4.0.0.xml

maven报错

没爆红报错

maven没爆红未必正确引入了依赖(一定要写版本、不写版本是由Spring默认依赖控制)

maven因为缺少依赖导致无法执行生命周期、插件,可通过该方式处理:

让maven认为仓库中已经没有该依赖,即:配置中央仓库的镜像
maven配置中央仓库镜像后当依赖不存在时可以跳过maven校验:不配置时当没网络连不上中央仓库会卡在校验,因为不知道中央仓库有无依赖

idea的配置覆盖后不起作用

可能是maven目录下的配置和覆盖配置两个配置中存在相同标签造成语法错误,导致无法识别覆盖配置,或其它覆盖配置标签导致的语法错误
此时设置仓库需要在原来的配置文件中加

某个依赖仓库找不到时候

1.可以下载其它依赖来下载该依赖
2.可以搜索组织名

找不到Serverlet等类报错

改变jar包版本

maven无法识别本地依赖

删除缓存repo文件

方法一

找到出错的jar包文件位置,删掉_maven.repositories文件
(或用文本编辑器打开,将“>XX=”改为“>=”,即删除main,当然main也可能是其他值)
,然后update project。就这么简单,完美解决。具体是告诉这个jar包来自本地,自己打包上去的!

方法二(推荐)

很简单
在这个文件后面追加两行
***.pom>ygsoft-internal-repository=
***.jar>ygsoft-internal-repository=
这个yyy就是你当前setting里的mirror的id,告诉maven,这个jar是你亲生的,不要不认了。

删除缓存update文件

尝试删除仓库中的.lastUpdated文件,先进入到仓库根目录,再执行如下命令

Window环境

for /r %i in (*.lastUpdated) do del %i
for /r %i in (_remote.repositories) do del %i

安装其它子工程

还有报错就先安装当前工程子工程

maven 查看异常信息:(加上-e -X )
mvn install -e -X

posted @ 2025-08-24 12:20  已宕机  阅读(4)  评论(0)    收藏  举报