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

12 天前
 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 ,写久了真的会降智(不思考合理性,不愿意接受其他,是的,我说的是我自己)

7883 次点击
所在节点    Java
126 条回复
diagnostics
12 天前
@1835407125 三年前的问题,请你“好解决”帮大家解决一下: https://stackoverflow.com/questions/65004670/how-to-run-tests-only-for-a-single-maven-module
fu82581983
12 天前
XML 如果是初学者可能会觉得繁琐,但是你如果用久了,你会发现它的结构与层次是最清晰的。

子模块管理问题,我倒没有遇到过,一般本地 install 之后,IDEA 就自动识别到最新的 SNAPSHOT 版本了。

CICD 问题,用 Jenkins 可以解决一部分,但是要特别灵活地编写 task ,估计只能上 Gradle 了。
Suaxi
12 天前
公司新项目组的新项目全转到了 gradle ,我自己的小玩楞还是用的 maven
yusheng88
12 天前
@diagnostics
1 、可能吧

2 、没太懂,依赖了没发版到 nexus 的模块?

3 、单元测试代码相互依赖吗?不太懂你的单元测试代码怎么写的。

4 、mvn 执行时,所有执行步骤都会顺序输出到控制台,有出于意料的操作,基本上都是有日志可跟踪的。我没见过 enforce 插件, 所以不评论, 但插件都可以自定义绑定执行阶段的
Mystery0
12 天前
maven 有官方文档用来指导 pom.xml 怎么填写吗,里面的一些配置项又是怎样生效怎样配置的?
最简单的一个自动推送私服,翻来翻去都是各种教程博客让写什么什么,例如想把一个 fat-jar 的配置改成非 fat-jar 的,看到那个 pom 都没处下手不知道怎么改
所以我已经都用 gradle 至少官方文档会告诉我怎么去配置
Mystery0
12 天前
至于说 gradle 下载很多版本的,执行 task 的时候用 gradle 命令而不是./gradlew 就和 maven 一样会使用系统装好的 gradle 了,这个时候版本全部都是由系统控制
Aresxue
12 天前
1.xml 可读性主要是不够简洁,版本管理和子模块管理这俩本来就没有分开的必要,gav 一共就三个维度;
2.使用姿势有问题,把 revision 和 relativePath 玩明白就好了;
3.还是姿势问题;
4.了解下阿里的 amaven 还有开源的 maven daemon ;
LPJD
12 天前
写 java 的,99.9%都是 maven 。上班复制粘贴了几年代码,没见过用 gradle 的,一次都没有见过
Ayanokouji
12 天前
dupenn
12 天前
要用 gradle 替代 maven ,都喊了多少年了,以前也是各种博主推荐,为什么到现在还没把 maven 干下去?我觉得可能是 gradle 相对 maven 并没有很大的进步,否则老项目不愿意替换,新项目总应该会很多去尝试的吧,但是其实并没有很多新项目去尝试 gradle 。
yazinnnn0
12 天前
我自己尽量不用 maven, 自己搞的玩具和公司自己一个人负责的项目全都是 gradle
diagnostics
12 天前
@Aresxue

2. relativePath 目前都是 ../ 我试过多个层级,用 ../my-proj-parent 这样去依赖,也会有问题。

revision 我没用,revision 这个是 maven-version-plugin 做的,不支持插值替换和生成 efficiently pom ,所以我改成脚本替换 version 来发布了

3. 有啥姿势?例如 spring-aop 也依赖 spring-core 和 bean , 单独跑 spring-aop 怎么做的不运行 core 的测试的?
chendy
12 天前
我,因为 gradle 的高级特性用不到,maven 够用,不想折腾
另外手里好几个百万行的老项目还在直接用 javac 编译呢,也活得好好的…
diagnostics
12 天前
@LPJD 可能写的都是 CRUD ,没接触过 Kafka 和 spring 这种项目吧
diagnostics
12 天前
@chendy 唉,现在的也能用,其实最大的问题是,这个问题,你花一周时间迁移后,99% 覆盖了没问题了,舒服了,但是得到的提升感觉没太大意义,无非是对项目后续发展友好点。

我干着干着,突然觉得不如多看点其他书学习下,国内这种环境,没人在乎开发者体验
chendy
12 天前
@diagnostics 其实说到开发体验这个事情,真的挺个人的
水平比较好的开发可能会倾向于使用更复杂的工具来更好的满足自己的个性化需求
但是现实中的情况往往是水平一般的开发居多,问题复杂一点就到处出问题,所以还是简简单单无功无过最好
SoloCompany
12 天前
@diagnostics

> 3. 你没懂我的意思,我想将测试分为 core, server, extension 独立跑,但是单独跑 exntension 会找不到 server 的依赖,必须先跑 server, 加个 am 能解决,但是除了编译 server ,还会执行 server 的测试,只能用 profile 解决

mvn -am -pl :artifacts -D'test=package/name/*'
diagnostics
12 天前
@SoloCompany 和 profile 差不多,am 不能只 compile ,maven 对依赖的定义太简单,只能依赖模块,不能单独依赖模块的测试、编译
xubeiyou
12 天前
gitlab 的 cicd 好用么?感觉不够清晰- - 不如 jenkins 相对功能强大 组件多。Maven 的话确实在速度和一些多项目嵌套的时候会有一种杂乱无章的感觉 但是我觉得整体还是相对清晰明了的。。。
SoloCompany
12 天前
至于 multi module project 的 sub-module 依赖找不到的问题, 根据经验 99.99% 是 version 没有写正确, 才会导致没有在 project tree 里 resolve 而是跑到 ~/m2 下载依赖了

正确配置的 multi module 没有遇到过 IDEA 无法识别的问题

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

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

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

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

© 2021 V2EX