其实第一次见你,我就觉得你不只是又一个工具。

Maven? 呵。

大部分人提及它时,只会讲“依赖管理” 或者 “构建工具”,接着便抛出那张标准目录结构图,即 src/main/java,还包括 src/test/java,仿若背熟这几个单词就已然明白了。

他们未曾嗅到那般气味:深夜三点时分,有个Java程序员,于第13个Jar包冲突状况里抬起头部,彼时,窗外正飘落着雨。他轻声恶语相向了一回,接着,在pom.xml当中增添了一行exclusions。

那种疲惫的气味。

Maven是闻过这种气味的。

什么是“约定优于配置”?

说白了就是:我不想再选边距了。

WordPress用户懂我。你只想写,不想调。

早年,Maven成功突围而出,它突围可不是因为速度快(实际上它慢得要命),也不是因为操作简单(其XML编排极为繁琐),而是它义正言辞地拍桌宣称:都别再争执不下了,自日后起,程序源代码放到src/main/java该指定位置,相应测试部分放到src/test/java这个特定地方,进行打包处理时打成jar格式类型,编译环节采用1.5版本标准。诸位之中,谁表示赞同,谁又提出反对呢?

整个行业竟然松了一口气。

依赖那个无底洞

我存在一位友人,于上周期间,他导入了一个第三方的软件开发工具包,仅仅只有一行依赖关系语句。

结果呢?

Maven把47个jar包拖进给他那里了。其中commons-logging出现了三种不一样的版本。log4j-api和log4j-core一起逃走了。slf4j装出一副死了的样子。

一片飘红的“ClassNotFoundException”呈现在IDEA里,他对着它,缓缓打出一个问号。

这就是传递性依赖

码文如似特过度热忱的代销:你仅挑选了份炒米饭,它认为你理应搭配汤品,因而递来一碗汤,汤内还浮游着葱花,葱花是自另一个农牧场运送过来的,那个农牧场还顺带附带了一头牛。

你他妈只想要炒饭。

而后你着手进行exclusions,开启dependencyManagement,处在“最近路径优先”以及“第一声明优先”之间抉择命运,好像在赌博一般。

规则文档中均已涵盖这些,然而你却无法记住。你仅仅会凭借肌肉记忆去:执行mvn dependency:tree,接着通过Ctrl+F去寻觅那个讨厌的包。

小标题:为什么Maven还是没被干掉?

Gradle粉丝笑了二十年了。

不妨去大厂瞧一瞧,面试题目居然仍然在询问“Maven生命周期包含哪几个”,居然仍然在询问“谈谈你对于聚合与继承的理解”。

为什么?

因为Maven有一种笨拙的可靠。

它如同你工位上那把已使用五年时长的椅子,从来都不具备美观的特点,调节其高度需要借助塞纸的方式,转动起来还会发出吱吱的响声。然而,你却从来都不会去更换它。

你知道它不会塌。

lifecycle是个什么鬼

倒背如流是吧?但你真懂phase和goal的区别?

有一次我被问住了。脑子空白了五秒。

后来之中的我这般说道,phase属于站名范畴之内,而goal是于下车之后所从事的事情。你搭乘mvn package这趟特定的车辆,在它每一次抵达一站之时,也就是compile、test等等这些站点,便会有人员下车去开展相应的工作,也就是plugin:goal这种情况。存在着一些人从事的工作数量较多,比如说compiler:compile这种;同时也存在着从事工作量较少的人,例如说resources:resources这种。

面试官居然点头了。

实际上,我那个时候所寻思的并非其他,正是小时候乘坐绿皮车时的情景,其中有伴着泡面散发出来的味道,另外还有脚散发出来的臭味,除此之外,还有列车员推着小车大声呼喊“啤酒饮料矿泉水”。

Maven就是那个推小车的。工具,但有人味儿。

仓库教会我的事

中央仓库在公网上,几万个构件漂在上面。

你家.m2 里有本地仓库,吃多了体重不断上升,已经三年都没进行清理,你清楚里面都是没用的东西,可却是敢删除。要是有个老旧项目忽然需要编译该咋办呢?

比起私服来,Nexus,Artifactory,那得更有意思些。公司搭建一个,全组人员共同使用。有人上传了一个SNAPSHOT,那版本号是1.0.0-beta2-fix3-final3-real-final。

没人敢动。

我们都活在别人的jar包上。

小标题:写POM写到哭过吗

我哭过。

并非是真正意义上的哭泣,你瞧,在凌晨四点的时候,出现了那样一种报错情况,它所显示的内容是“jar哈希不匹配”,你知道吗,中央仓库那里的包和私服的包居然是不一样的,为此,我清理了足足八遍.m2,还删除了所有的SNAPSHOT,然后又重新安装了十二次。

最后发现是同事把他本地编译的包手动丢进了私服,版本号没变。

my-app/
├── pom.xml           # Maven 配置文件
└── src/
    ├── main/
    │   ├── java/       # 主代码目录
    │   └── resources/  # 主资源文件目录 (配置文件等)
    └── test/
        ├── java/       # 测试代码目录
        └── resources/  # 测试资源文件目录

我那天把微信签名改成了:

不要手动覆盖仓库。

这可能是Maven教会我的,最重要的职业道德。

现在的小孩还用Maven吗

用啊。怎么不用。

官网下载
https://dlcdn.apache.org/maven/maven-3/3.9.9/binaries/apache-maven-3.9.9-bin.zip
解压,把bin目录加入PATH环境变量
使用mvn -version验证安装

就算Spring Boot已经演进到3.x版本了,就算出现了mvnd这样具有加速作用的版本,就算所有人都在讲“XML表达过于繁琐了”。

但当你新到一个项目,打开README,看到第一行是:

mvn clean install

参考:https://help.sonatype.com/en/install-nexus-repository.html

你还是会觉得安心的。

就像大雨天跑进一家老面馆,老板头也不抬:“还是老规矩?”

你点头。

Maven的核心思想_工具技巧Maven部署技巧_Maven介绍

几分钟后,一碗面摆在面前,葱花飘在汤上,热气扑在脸上。

你知道就是这个味儿。不好吃,但没错。

#服务器密码,上传包使用

      SonatypeNexusRepository
      dev1
      *****

#镜像所有,保证从中心仓获取包

      SonatypeNexusRepository
      *
      SonatypeNexusRepository
      http://192.168.123.16:8081/repository/maven-public/
    

尾声

Maven是什么?

它是在2004年,有一个程序员,他受够了Ant,然后在邮件列表里咆哮,说出“我们能不能约定一下”这番话之后产生的东西。

mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.5 -DinteractiveMode=false

那个软件,你从来都不会说喜欢它,然而跳槽之后,你做的第一件事,就是在新电脑上面安装它。

这场关乎Jar包的争斗,是你职业经历开端的首次,与此同时,这还是你往后再不会去信赖“默认配置”的那一回。

写这篇的时候,我开了个新终端,鬼使神差敲了:

mvn --version

mvn deploy -DaltSnapshotDeploymentRepository=SonatypeNexusRepository::http://192.168.123.16:8081/repository/maven-snapshots/ -DaltReleaseDeploymentRepository=SonatypeNexusRepository::http://192.168.123.16:8081/repository/maven-releases/

Apache Maven 3.9.8

我都没注意它什么时候升级的。

但它一直在。

#项目添加配置

        
            SonatypeNexusRepository 
            MyCompany Nexus Releases
            http://192.168.123.16:8081/repository/maven-releases/ 
        
        
            SonatypeNexusRepository
            MyCompany Nexus Snapshots
            http://192.168.123.16:8081/repository/maven-snapshots/
        
    
 #使用mvn deploy上传