其实我对Maven挺矛盾的。

用了快十年,爱它,也烦它。

喜好的是那一种将约定置于配置之上的情况,引入一个全新项目进来,执行mvn clean install操作,咖啡尚未变凉包裹已然下载完成。厌烦的是——那个处在项目里、历经二十年宛如虫在琥珀之中般固定不动的pom.xml文件。

那天,看到官网文档之中写着,其中有这样的内容,即强力标签所标注的,“With the Maven build schema preserved in amber…”。

琥珀。这个词真他妈准。

漂亮,但是死透了。

Maven 4 modelVersion 4.1.0 changes_工具技巧Maven部署技巧_Apache Maven 4 new features

你管那个叫“模块”吗

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发过一分钱。

升个级而已,还抱怨什么呢。