有多少人还在用 Maven 构建项目?

17 天前
 diagnostics

最近用 maven 有些槽点(当然也可能是我自己对 maven 的学习也不够深入), 我既写 java 也写 scala, 有人在 scala 帖子诟病的 sbt 难用,相比之下 maven 才是真的“难用”。

我说的难用不是指难安装、简单打包,而是带一些场景:

1. xml 问题

xml 可读性某些层面太差了,过于繁琐,对版本管理,子模块管理全部揉杂在一起

2. 子模块管理问题

我们的项目组开发是一个 framework 的,也就是自身需要维护一大堆依赖,被别人引用的时候也会带上这些依赖的版本。

我们尝试过像 spring 那样用:

但是 IDEA 的识别不够好,总是出现某些子模块的版本找不到( IDEA 无法识别到这些子模块就是我维护的,而不是第三方库,而是反过来,总是去远仓库下载而不是项目的 target 上查找)

后面我们直接用 root 管理所有的 dependenices ,还是有问题,但是遇到问题只能本地 install 一下

3. CICD 编写问题

我们用的是 Gitlab CI/CD ,由于模块太多,一个 mvn test 运行太慢了,等个 CI 的功夫能干很多事情,但是我们尽可能希望快一点验证 commit ,继续做后续的测试,所以我们搞了按模块区分的单测:例如 coreTest 、serverTest 、extensionTest 等。。。

maven 可以用 mvn test -pl core -pl server 这样解决,但是部分 extension 模块是依赖 server 或者 core 的,就只能用 mvn test -pl extension -am also make 依赖,这样的后果就是跑 extension 的时候,把 core 的单测也跑了(这还加速啥,依赖多的项目,很大概率直接跑个完整的 test )。 这个问题,我们后面用 profiles 解决了,但是维护起来太鸡巴蛋疼,太繁琐了(重构的时候)

4. 构建 Task 诊断问题

我改造 CICD 的时候,希望能利用上缓存机制,多个 task 来加速,但是我发现 compile 的时候也会把 validate 阶段的 enforce 插件也给跑了... 问题是,我看了下好像没有命令来看执行 xx 的时候会同时执行什么,只能跑一下 xx 然后看。。。

结论

可能我用 maven 的姿势不太对,但是越深入就越感觉这玩意不适合复杂项目,就适合简单做个:

clean 、test 、package 、install 、deploy

怀念 sbt...(尝试过 gradle 、迁移看了半天,需要考虑点有点多,还没正式打算改过去,改过去也不知道好不好)

ps:写 Java 的人里可能有大神,但是只写 Java ,写久了真的会降智(不思考合理性,不愿意接受其他,是的,我说的是我自己)

8127 次点击
所在节点    Java
126 条回复
marding
17 天前
目前觉得还行, 没觉得 maven 难用
unclevv
17 天前
maven 十几年了,够稳定,够经典,还真有啥 maven 满足不了吗?那你得好好想想是不是没必要的需求了。
awalkingman
17 天前
@alwaysonlinenet 我也想问
qq135449773
17 天前
maven 更像是一种 build system ,golang/node/python 对应的 gomod 、pnpm 、pip 那种,除了 gomod 可能沾点构建的意思之外,其他那几个脚本语言,跟 maven 比更像是纯粹的依赖管理工具。。怎么能把这几样东西放在一起比呢。。

从 build system 的角度来看的话,maven 其实抽象能力也不行,灵活度远没有 Gradle 那种打开脚本就能写 task 那么方便,整个 flow 我个人感觉 mvn 控制起来也没有 gradle 那么精细。。。

这个问题归根结底还是得看项目复杂程度的,需要考虑当前项目能不能吃到 Gradle 的 benefit 了,吃不到的话用什么都一样。。。
Nazz
17 天前
@javaisthebest 村里刚通网吗, 五六年前 go 就有官方包管理工具了
sherlockwoo
17 天前
使用 maven helper 插件时怎么使用 clean install -am -pl 来自动构建依赖的包啊?
OMGZui
17 天前
都在用,没啥区别
blackmirror
17 天前
maven 管理还是非常好用的
Daitabashi
17 天前
确实不直观, 确实各种依赖找不着,但也大概没有更好的了
oamu
17 天前
@zhenjiachen gradle 可不慢。spring 因为 maven 构建太慢了,都切换到 gradle 去了。
zhenjiachen
16 天前
@oamu 在我本地开发感觉是这样,maven 项目 reload 感觉比 gradle 快,第一次编译 maven 也是比较快,后面编译时间差不多。还有就是 idea 经常对 gradle 的索引失效 gradle 文件爆红需要重新索引,maven 没发生过。
qingjiang
16 天前
android studio 使用 gradle 构建的,有时候没整明白,也只会配置相应环境

gradle 查阅资料比较少

maven 对 java 开发相对友好点

maven 参考资料比较多
yb2313
16 天前
@Ayanokouji #1 pdm,启动
ikas
16 天前
1.喜好问题,不做评价,个人喜欢 xml,讨厌一个人一个样的脚本
2.一个 parent 模块来做依赖 版本 插件管理. 其它模块继承自 parent,每个模块均是平级的.然后使用聚合项目来做模块管理,聚合你需要的模块,可以使用 profiles 来配置不同的聚合,也可以建立多个这样的聚合项目.聚合项目不继承 parent,与其他模块也是评级的
导入到 ide 时,只要选择聚合项目即可.如果需要 install 或者 idea 无法编译,那一定是 maven 模块配置问题
3.如果使用 2 的组合方式,那么只要精心配置好模块,利用 profiles 可以解决
4........
duanzhanling
16 天前
maven 还是可以的,gradle 也不错
xuanbg
16 天前
这不是 maven 的问题,而是架构设计的问题。子模块什么的,我们压根不许存在,都是直接打成二方包引用。所以跑单测也就值跑项目代码,不会连引用的都要跑一遍。
diagnostics
16 天前
@ikas 你说了和没说一样,都是我们在做的,然而要用 profile 来实现,实际上很蛋疼。

一个功能:我在 scala 2.12 下,生成带 _2.12 后缀的版本,为了兼容,scala 2.13 就不带后缀。

有些通用包,没有 scala 依赖,那就需要手动关闭 mvn deploy, 不然 nexus 不能更新 release ,会让 ci 失败,所以光一个 scala profile 需要配置后缀,mvn deploy 开关

除此之外,对于一类单测,也需要 profile 跳过 maven surefire

维护多了你就知道不方便。


2 的问题是,有人提到过,删除模块的时候会遇到。
Narcissu5
16 天前
maven 的多模块太蛋疼了,一个项目内的模块都不能直接相互依赖,必须通过版本,偏偏国内开发者又超喜欢拆模块
gradle 这方面好太多了,怕兼容麻烦有 wrapper
diagnostics
16 天前
@Narcissu5 你说他简单,就一个 dependencies ,但是 sbt 的依赖管理也是这么干的,也能识别。
你说他就一个 dependencies ,代码不好实现,那又不学 gradle 搞个 project(xx) 来区别引入的是项目还是外部依赖
magicZ
16 天前
懒得学加上我负责的模块没人动,一直用 maven

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1050791

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX