其实我对Maven挺矛盾的。
用了快十年,爱它,也烦它。
喜好的是那一种将约定置于配置之上的情况,引入一个全新项目进来,执行mvn clean install操作,咖啡尚未变凉包裹已然下载完成。厌烦的是——那个处在项目里、历经二十年宛如虫在琥珀之中般固定不动的pom.xml文件。
那天,看到官网文档之中写着,其中有这样的内容,即强力标签所标注的,“With the Maven build schema preserved in amber…”。
琥珀。这个词真他妈准。
漂亮,但是死透了。

你管那个叫“模块”吗
Maven 3时代,我们管子项目叫“模块”。
然后Java 9来了,带着真正的模块系统。
然后Spring Modulith来了。
而后,所有人都开启了询问模式:你所提及的这个module,究竟是不是那个令人难以捉摸的module呢?
每次对着新人去讲述项目结构:“这是父级的pom,在其下面存在着几个module…”。
新人问:“module是Java 9那个?”
我:“不是,是Maven的module。”
新人:“那Java 9那个呢?”
我:“那是module,这个是‘模块’。”
……
我当时的表情应该像吃了苍蝇。
Maven 4终于动手了。
。
不叫模块了,叫子项目。
被标记为deprecated,等着哪天彻底入土。
改个名,世界清爽了。
Build POM / Consumer POM
这个是我最想给它鼓掌的地方。
过去你部署上去的那个参数对象模型,跟你在本地构建时所使用的参数对象模型,是同一物品。
4.1.0
com.example
sample-app
1.0.0
里面什么都有:插件配置、profile、甚至本地绝对路径。
别人依赖你的jar,顺带把你那堆垃圾也吃了。
存在一位老哥,在Confluence之中书写得极为直白,其他构建工具,也就是Gradle、SBT,它们的build格式属于私有的范畴,于发布之际才会生成一个洁净的POM给予消费者,而唯独Maven,非要将自身的关键部分暴露在众人眼前。
现在好了。
构建项目对象模型强>:你选用4.1.0 ,爱写什么就写什么 ,插件 、配置文件 、杂乱无章的私有配置 ,随意。
消费者产品对象模型:在进行部署操作时,会自行生成一个版本为4.0.0的经过瘦身处理的版本,该版本呈现扁平化特点,其继承关系已展开,物料清单也已展开,仅存在依赖关系。
默认是关的。
哎唷,Maven团队依旧是那种风格:给了你相应功能,然而却是先处于关闭状态,担心你会骂咧。
使用Mvn进行部署,设置使得Maven消费者的项目对象模型扁平化的参数为true。
又或者,将其书写于.mvn/maven - user.properties这个文件当中。
二十年的屎山,终于开始铲了。
那个叫root的东西
还有一个事我以前一直没搞明白。
项目根目录,到底怎么定义?
你在子模块里写:
../checkstyle.xml
这个..到底是哪儿?
碰到个让人摸不着头脑的状况:Maven 3居然给出了个不伦不类的方案,啥情况呢,就是你只要放置一个.mvn文件夹,完了它就偏偏认定那就是根哒。
但如果用户没放呢?
Maven 4给了官方答案:
${project.rootDirectory}
${session.topDirectory}
${session.rootDirectory}
三个变量,区分项目定义和会话上下文。
你甚至可以在pom的标签上加root="true"。
写死了。不用猜了。
升级工具,mvnup
我试了一下。
Maven的升级检查命令,其检查依据的模型版本为4.1.0。
它会扫你的pom,告诉你哪里要改。
插件版本、弃用阶段、重复声明、甚至帮你把换成。
官方说:跑完这个,你还能退回去。
安全感给足了。
其实我觉得,大部分项目不需要立刻升4.1.0。
然而去运行一回mvnup check,瞧瞧哪些配置埋下了隐患,也不失为一种不错的做法。
并发构建:不是让你飞,是让你别堵车
b concurrent。
Maven 4的生命周期从图变成了树。
不是那种“哇快了三倍”的黑科技。
有一种更为合理的调度方式,即:只要A模块处于ready状态,那么就能够进行编译,而无需等待B模块完成package流程。
对于百来个模块的老项目,这一口是续命的。
关于“免费”
写到这里突然想到——
Maven这个工具,二十多年,一直免费。
没有企业版,没有收费计划,没有云服务绑定。
有的人在邮件列表之中吵吵嚷嚷,有一些人于GitHub之上修正程序漏洞,还有些人在IRC里回应新手所抛出的问题。
RC - 4进行发布之际,release notes当中存在着一行小字:
“Test Maven 4.0.0-rc-4 and report issues.”
不是求赞赏。
是求测。
我用了十几年,没给Apache发过一分钱。
升个级而已,还抱怨什么呢。

Comments NOTHING