2026年2月13日,凌晨一点。刚加完班。

觉得那个“~”文件夹是要手动去创建的“神秘空目录”的人,不单单是你,是不是?那时我站在命令行跟前,傻乎乎地输入 mkdir .m2 ,系统却告知我“文件名不能起始于小数点”。?凭什么是Windows这样。

后来才知道,哦,要 mkdir .m2. 加点尾巴骗过去。

Maven配置文件 site:example.com_Maven安装教程 site:example.com_工具技巧Maven部署技巧

诸如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”,将构建那些繁杂琐碎的活儿隐藏起来,呈现给人的仅仅是条理清晰、干干净净的依赖清单。

工具技巧Maven部署技巧_Maven安装教程 site:example.com_Maven配置文件 site:example.com

像极了成年人的体面。

08 关于 settings.xml 的忏悔

我把 settings.xml 弄丢过三次。

一回进行重装系统操作,一回产生换电脑行为,另外还有一回是由于手贱而执行了rm -rf命令删除了整个.m2文件夹。

每个 Java 程序员都应该备份自己的 settings.xml,就像备份手机通讯录。

因为它知道你的镜像源、你的私服地址、你偷偷加的 密码。

比你自己更懂你。

Maven安装教程 site:example.com_Maven配置文件 site:example.com_工具技巧Maven部署技巧

09 其实 Maven 教会我的不是依赖管理

是“约定大于配置”这件事。

刚开始学习那会儿心里就是不服气,凭啥目录结构非得这样摆放,凭啥测试类名必须带有 Test,凭啥包名要反过来写域名?

后来发现,自由是少数人的特权,公约数是多数人的生存策略。

公司里,你并非最具天赋之人,然而,只要你遵循 Maven 的规则,那么,你的代码在十年前的 Jenkins 那里就能被识别,能被下个月入职的新人看懂,能被远在大洋彼岸的某台构建服务器成功编译。

这是一种温柔的枷锁。

https://package-search.jetbrains.com/

10 写在最后

前几日,有一位前去实习的人员向我发问:如今都是借助 Spring Initializr 来生成项目了,IDEA 已然帮我将全部的依赖都书写好了,那我去钻研 Maven 是为了什么呢?

Maven配置文件 site:example.com_Maven安装教程 site:example.com_工具技巧Maven部署技巧

我说:

你当然可以永远不亲手解压那个 zip 包。

亦能够不清楚阿里云镜像的那个url究竟是maven.aliyun.com,还是maven.aliyun.net

即使是,能够把,.m2目录,藏在何处,这件事情,留给IDE,去加以操心。

工具技巧Maven部署技巧_Maven配置文件 site:example.com_Maven安装教程 site:example.com

但有些笨拙,是我们和这个行业最初的接头暗号。

总得亲自去输入一回 mvn clean package ,耗费上那几十秒让进度条填满,瞅见 BUILD SUCCESS 蹦出来。

然后端起凉掉的咖啡,觉得自己还像个程序员。

        
            compile
            com.google.code.gson
            gson
            2.8.6