登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
签到
每天签到奖励2-10圆
导读
排行榜
TG频道
发帖说明
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
写记录
VIP申请
VIP网盘
网盘
联系我们
发帖说明
每日签到
道具
勋章
任务
淘帖
动态
分享
留言板
导读
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
业界区
›
业界
›
Maven中的这些坑,99%的人不知道!
Maven中的这些坑,99%的人不知道!
[ 复制链接 ]
要燥
2025-9-26 11:36:49
前言
最近经常遇到知识星球中的小伙伴,问我一些关于Maven的问题。
说实话,Maven在我们日常开发中,使用的频率非常高。
今天这篇文章跟大家总结一下,使用Maven时一些最常见的坑,希望对你会有所帮助。
1.Maven核心原理
1.1 坐标体系
坐标冲突案例
:
<dependency>
<groupId>org.apache.httpcomponents</groupId>
httpclient</artifactId>
<version>4.5.13</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
httpclient</artifactId>
<version>1.0.0</version>
</dependency>
复制代码
现象
:NoSuchMethodError 随机出现,因类加载器加载了错误Jar
1.2 依赖传递
依赖解析流程:
传递规则
:
最短路径优先
:A→B→C→D(1.0) vs A→E→D(2.0) → 选择D(2.0)
第一声明优先
:先声明的依赖版本胜出
1.3 生命周期
关键特性
:
执行mvn install会自动触发从validate到install的所有阶段
插件绑定
:每个阶段由具体插件实现(如compile阶段绑定maven-compiler-plugin)
1.4 仓库体系
私服核心价值
:
缓存公共依赖 → 加速构建
托管内部二方包 → 安全隔离
控制依赖审批流 → 合规管控
2.Maven中最常见的坑
坑1:循环依赖
案例
:订单模块order依赖支付模块payment,而payment又反向依赖order
报错
:[ERROR] A cycle was detected in the dependency graph
解决方案
:
抽取公共层:order-api ← order-core & payment-core
依赖倒置
:
// 在payment模块定义接口
public interface PaymentService {
void pay(Order order); // 参数用Order接口
}
// order模块实现接口
public class OrderServiceImpl implements PaymentService {
// 实现逻辑
}
复制代码
坑2:依赖冲突
典型场景
:引入A、B两个组件
A依赖C:1.0
B依赖C:2.0
→ Maven按规则选择其一,导致另一方兼容性问题
定位工具
:
mvn dependency:tree -Dverbose
复制代码
输出:
[INFO] com.example:demo:jar:1.0
[INFO] +- org.apache.httpcomponents:httpclient:jar:4.5.13:compile
[INFO] | \- commons-logging:commons-logging:jar:1.2:compile
[INFO] \- com.aliyun:oss-sdk:jar:2.0.0:compile
[INFO] \- commons-logging:commons-logging:jar:1.1.3:compile (版本冲突)
复制代码
强制统一版本
:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>commons-logging</groupId>
commons-logging</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
</dependencyManagement>
复制代码
坑3:快照依赖
错误配置
:
<dependency>
<groupId>com.internal</groupId>
core-utils</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
复制代码
风险
:相同版本号可能对应不同内容,导致生产环境行为不一致
规范
:
生产发布
:必须使用RELEASE(如1.0.0)
内部联调
:使用SNAPSHOT但需配合持续集成
坑4:依赖范围错误
误用案例
:
<dependency>
<groupId>javax.servlet</groupId>
javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>compile</scope>
</dependency>
复制代码
后果
:Tomcat中运行时抛出java.lang.ClassCastException(容器已提供该包)
范围对照表
:
Scope编译测试运行典型用例compile✓✓✓Spring Coreprovided✓✓✗Servlet APIruntime✗✓✓JDBC驱动test✗✓✗JUnit
坑5:资源过滤缺失
问题现象
:src/main/resources下的application.yml未替换变量:
db:
url: ${DB_URL} # 未被替换!
复制代码
修复方案
:
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
复制代码
同时需在pom.xml中定义变量:
<properties>
<DB_URL>jdbc:mysql://localhost:3306/test</DB_URL>
</properties>
复制代码
坑6:插件版本过时
经典案例
:JDK 17+项目使用旧版编译器插件
<plugin>
<groupId>org.apache.maven.plugins</groupId>
maven-compiler-plugin</artifactId>
<version>3.1</version>
</plugin>
复制代码
报错
:Fatal error compiling: invalid target release: 17
升级方案
:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<source>17</source>
<target>17</target>
</configuration>
</plugin>
复制代码
坑7:多模块构建顺序
错误结构
:
parent-pom
├── user-service
├── payment-service # 依赖order-service
└── order-service
复制代码
构建命令
:mvn clean install → 可能先构建payment-service失败
正确配置
:
<modules>
<module>order-service</module>
<module>payment-service</module>
<module>user-service</module>
</modules>
复制代码
坑8:本地仓库污染
故障场景
:mvn clean install成功,同事却失败
根源
:本地缓存了损坏的lastUpdated文件
清理方案
:
# 清除所有无效文件
find ~/.m2 -name "*.lastUpdated" -exec rm {} \;
# 强制重新下载
mvn clean install -U
复制代码
坑9:私服配置错误
慢如蜗牛的原因
:
中央仓库直连(国内访问慢)
镜像配置错误
优化配置
(settings.xml):
<mirrors>
<mirror>
<id>aliyun</id>
<name>Aliyun Maven Mirror</name>
<url>https://maven.aliyun.com/repository/public</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
复制代码
坑10:IDE与命令行行为不一致
典型分歧
:
Eclipse能编译,命令行失败 → .project与pom.xml不一致
IDEA运行正常,mvn test失败 → 测试资源未配置
统一方案
:
<testResources>
<testResource>
<directory>src/test/resources</directory>
<filtering>true</filtering>
</testResource>
</testResources>
复制代码
3.企业级最佳实践
依赖管理黄金法则
严格父POM
:所有版本在父POM的中锁定
持续检查
:CI流水线加入依赖检查
mvn versions:display-dependency-updates
复制代码
公私分明
:
公开依赖 → 从阿里云镜像下载
内部依赖 → 私服管控
高可用构建架构
总结
能用
:会执行mvn clean install
会用
:理解生命周期、解决依赖冲突
善用
:
通过mvn dependency:analyze剔除无用依赖
使用archetype生成标准化项目
集成enforcer-plugin规范构建
Maven的本质不是工具约束,而是架构纪律
。
当你不再被构建失败打断思绪,当你的依赖树如水晶般透明,才算真正驯服了这只“构建巨兽”。
最后说一句(求关注,别白嫖我)
如果这篇文章对您有所帮助,或者有所启发的话,帮忙关注一下我的同名公众号:苏三说技术,您的支持是我坚持写作最大的动力。
求一键三连:点赞、转发、在看。
关注公众号:【苏三说技术】,在公众号中回复:进大厂,可以免费获取我最近整理的10万字的面试宝典,好多小伙伴靠这个宝典拿到了多家大厂的offer。
本文收录于我的技术网站:http://www.susan.net.cn
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
Maven
中的
这些
不知道
相关帖子
CFD中的严格温度方程
【光照】[各向异性]在UnityURP中的实现
【光照】[物理模型]中的[BRDF]是什么?
Torch中的tensor size
订单初版—4.取消订单链路中的技术问题说明文档
读技术之外:社会联结中的人工智能02劳工
K8s中的RBAC认证授权之基于HTTPS证书给User授权认证
读技术之外:社会联结中的人工智能01地球
读技术之外:社会联结中的人工智能03工作场所
Maven多模块构建加速方案
vip免费申请,1年只需15美金$
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
安全
CFD中的严格温度方程
0
360
绂染
2025-10-04
业界
【光照】[各向异性]在UnityURP中的实现
0
416
顾星
2025-10-04
业界
【光照】[物理模型]中的[BRDF]是什么?
0
584
睁扼妤
2025-10-05
安全
Torch中的tensor size
0
867
戟铵腴
2025-10-05
业界
订单初版—4.取消订单链路中的技术问题说明文档
0
164
鞠古香
2025-10-06
安全
读技术之外:社会联结中的人工智能02劳工
1
14
忌才砟
2025-10-07
业界
K8s中的RBAC认证授权之基于HTTPS证书给User授权认证
0
164
驼娑
2025-10-07
安全
读技术之外:社会联结中的人工智能01地球
0
10
倘伟
2025-10-08
安全
读技术之外:社会联结中的人工智能03工作场所
0
118
圄旧剖
2025-10-08
安全
Maven多模块构建加速方案
0
241
湄圳啸
2025-10-10
回复
(1)
赶塑坠
昨天 16:37
回复
使用道具
举报
照妖镜
懂技术并乐意极积无私分享的人越来越少。珍惜
vip免费申请,1年只需15美金$
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
浏览过的版块
程序
安全
科技
签约作者
程序园优秀签约作者
发帖
要燥
昨天 16:37
关注
0
粉丝关注
19
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
anyue1937
9994888
dage888
999994
富账慕
10007
4
匝抽
9986
5
孙淼淼
9992
6
柴古香
9993
7
筒濂
9982
8
凌彦慧
9988
9
崔瑜然
9984
10
慢秤
9979
查看更多