其实第一次见你,我就觉得你不只是又一个工具。
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
你还是会觉得安心的。
就像大雨天跑进一家老面馆,老板头也不抬:“还是老规矩?”
你点头。

几分钟后,一碗面摆在面前,葱花飘在汤上,热气扑在脸上。
你知道就是这个味儿。不好吃,但没错。
#服务器密码,上传包使用
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上传

Comments NOTHING