2026年2月13日,凌晨一点。刚加完班。
觉得那个“~”文件夹是要手动去创建的“神秘空目录”的人,不单单是你,是不是?那时我站在命令行跟前,傻乎乎地输入 mkdir .m2 ,系统却告知我“文件名不能起始于小数点”。?凭什么是Windows这样。
后来才知道,哦,要 mkdir .m2. 加点尾巴骗过去。

诸如Maven这般的事物,恰似初恋一般,明明蠢笨到了极点,然而我们依旧怀旧。
01 你确定真的“安装”好了吗
现在到处都是 SDKMAN、Scoop、Homebrew。
http://maven.apache.org/download.cgi
我键入一行 ,scoop install maven ,而后快速地运行完毕 ,似乎并未有任何状况发生。
然而,那种感觉并非正确。恰似相亲之时,他人将对方的微信推送给你,而你未曾亲自去追求过。
因此随后我依旧在官网下载了那个 zip,实施解压操作,随后看到那诸多的.bat 文件放置于 bin 目录之内。当手动将路径粘贴至环境变量的那个瞬间,我方才感觉到这便是我视作“迎娶”入门并且接纳进来的工具。
对于环境变量这个东西,老一辈程序员将其视作至高无上的圣旨,而我们这一代人却把它当成玄之又玄的学问。
02 网速治好了我的精神内耗(并没有)
mvn -v
默认 Maven 中央仓库在美国。
没有人确切知晓究竟是啥人才施行的规定,Java 的整个世界当中,所有称得上美好的种种事物,全部都被存放放置在了那个名为 repo.maven.apache.org 的地方。
首回之际,我实施了 mvn clean install 操作,然而进度条却于 0% 的位置,整整僵持了十分钟之久。
我以为是电脑坏了。重启,再试。又十分钟。
然后我发现了阿里云镜像。
那一刻,我明白了什么叫“技术主权”。
这可不是在讲爱国之类的事儿哦……就是当下载速度从每秒3千字节变为每秒3兆字节之际呀,你会饶恕这世间所有的延迟以及丢包现象呢。
03 小标题:pom.xml 到底能不能写注释?
mkdir ~/.m2
notepad settings.xml
实际上,是不可以进行书写的。XML 具备允许注释的特性,然而,Maven 偶尔会出现异常状况 ,会抽风。
我初次着手撰写项目,将所有存在依赖关系的版本号通通书写于properties之中,自认为自己俨然就是架构师。
后来发现前辈的代码里全是这样的:
${project.parent.version}
<!-- D:devtoolsm2_repo -->
aliyunmaven
*
阿里云公共仓库
https://maven.aliyun.com/repository/public
jdk
11
${java.version}
${java.version}
${java.version}
${java.version}
UTF-8
UTF-8
UTF-8
true
true
spring
https://maven.aliyun.com/repository/spring
true
true
spring
https://maven.aliyun.com/repository/spring-plugin
true
true
jdk
我问为什么。他说不知道,大家都这么写。
这就是 Maven 生态:你不需要理解,你只需要遵守。
04 依赖地狱是真实存在的
mvn archetype:generate
Gradle 粉丝总爱嘲笑 Maven 太啰嗦。
确实,我予以承认。Gradle仅用一行implementation便得以解决之事,Maven却需写上五层嵌套,恰似俄罗斯套娃一般。
然而,他们未曾对你讲,Maven 的严谨恰好守护着我们这般的普通之人。
接手过一回项目,那次,Gradle脚本之中到处都是exclude以及force,然而,究竟最终classpath里所装载的是guava的哪一个版本,却并无任何人知晓。
并且,Maven 起码会如实地告知你,它所做的是选择了最短线路的那个依赖内容的行为 ,我选了最短路径的那个依赖。
傻人有傻福。
05 小标题:为什么不喜欢写 test?
我承认。
每次写单元测试都像在给自己的代码写墓志铭。
可是,Maven 强制要求你将 test 文件夹放置在那个位置,也就是放置在 src 的下方,使其与 main 处于同等地位。
my-app
|-- pom.xml
`-- src
|-- main
| `-- java
| `-- com
| `-- mycompany
| `-- app
| `-- App.java
`-- test
`-- java
`-- com
`-- mycompany
`-- app
`-- AppTest.java
它在暗示你:不写测试的代码,是不完整的尸体。
后边我将 JUnit 从 3.8.1 提升至 4.13 ,在执行 mvn test 时,于瞅见绿条的那一瞬间,的确存有某种……难以表述清楚的成就感。
06 mvn dependency:tree 是成年人的 CT 扫描
有一次线上报 NoSuchMethodError。
整个组慌了,有人说回滚,有人说重启试试。
4.0.0
yitian.study
hello
1.0-SNAPSHOT
jar
hello
http://maven.apache.org
UTF-8
junit
junit
3.8.1
test
我静静地将终端开启,随后按键敲入了,mvn dependency:tree。
最终发觉,log4j 是被两个不一样的间接依赖给引入进来的,版本之间相差了一个大版本。
那一刻我突然理解了医生看 CT 片子时的表情——冷静,但什么都逃不过眼睛。
07 小标题:Maven 4 来了,Java 17 是入场券
已至2026年,Maven终于提出要求,需Java17方可运行。
mvn compile
别慌张,并非要你使之将项目提升至十七,而是 Maven 该类“管家”换上了新型西装。
现在,它能够产生“消费者 POM”,将构建那些繁杂琐碎的活儿隐藏起来,呈现给人的仅仅是条理清晰、干干净净的依赖清单。

像极了成年人的体面。
08 关于 settings.xml 的忏悔
我把 settings.xml 弄丢过三次。
一回进行重装系统操作,一回产生换电脑行为,另外还有一回是由于手贱而执行了rm -rf命令删除了整个.m2文件夹。
每个 Java 程序员都应该备份自己的 settings.xml,就像备份手机通讯录。
因为它知道你的镜像源、你的私服地址、你偷偷加的 密码。
比你自己更懂你。

09 其实 Maven 教会我的不是依赖管理
是“约定大于配置”这件事。
刚开始学习那会儿心里就是不服气,凭啥目录结构非得这样摆放,凭啥测试类名必须带有 Test,凭啥包名要反过来写域名?
后来发现,自由是少数人的特权,公约数是多数人的生存策略。
公司里,你并非最具天赋之人,然而,只要你遵循 Maven 的规则,那么,你的代码在十年前的 Jenkins 那里就能被识别,能被下个月入职的新人看懂,能被远在大洋彼岸的某台构建服务器成功编译。
这是一种温柔的枷锁。
https://package-search.jetbrains.com/
10 写在最后
前几日,有一位前去实习的人员向我发问:如今都是借助 Spring Initializr 来生成项目了,IDEA 已然帮我将全部的依赖都书写好了,那我去钻研 Maven 是为了什么呢?

我说:
你当然可以永远不亲手解压那个 zip 包。
亦能够不清楚阿里云镜像的那个url究竟是maven.aliyun.com,还是maven.aliyun.net。
即使是,能够把,.m2目录,藏在何处,这件事情,留给IDE,去加以操心。

但有些笨拙,是我们和这个行业最初的接头暗号。
总得亲自去输入一回 mvn clean package ,耗费上那几十秒让进度条填满,瞅见 BUILD SUCCESS 蹦出来。
然后端起凉掉的咖啡,觉得自己还像个程序员。
compile
com.google.code.gson
gson
2.8.6

Comments NOTHING