为什么 Java 的包管理器都这么复杂?

2021-02-15 18:04:09 +08:00
 SystemLight
  1. 反观 node 的 npm,python 的 pip,.net 的 nuget 哪一个不是一个命令就安装好的依赖包
  2. 为何 java 的 gradle 或者 maven 都没有这样的特性,还需要自己去配置文件而不是命令安装,而且 gradle 用的 groovy 闭包写法外行看了完全懵逼,而 npm 的 package.json 用 json 语法易读相当高
  3. Java 包管理方案难道就不能简单一点,为何要搞得如此复杂,难道不应该是花费更多精力处理业务逻辑么,包管理搞得如此复杂还要去配置这个东西
20244 次点击
所在节点    Java
158 条回复
icyalala
2021-02-15 23:26:22 +08:00
npm 和 pip ?你是认真的吗?
xarthur
2021-02-15 23:28:16 +08:00
@SystemLight gradle 会重用不同项目里的相同依赖。
xarthur
2021-02-15 23:29:58 +08:00
@hantsy 我个人喜欢 gradle 还有一点就是它用 groovy/kotlin 做 dsl,这个比起看一堆 xml 好受多了。而且可以很便捷的写一些脚本方便自己使用,打包成可以分享的插件也方便。
SystemLight
2021-02-15 23:32:36 +08:00
@hafuhafu 可能心情上不太一样吧,毕竟 JSON 文件通俗易懂,groovy 语言看着懵逼吧,但是 java 语法糖总觉得太少了对比.net5,可能要追求稳定吧。
xuweifeng1987
2021-02-15 23:33:43 +08:00
看了下评论,笑死啦哈哈

其实 maven 和 npm 原理类似,只不过 maven 肩负的更多,maven 管理 jar 包只是很小一部分功能,看看 maven 第三方构建插件生态,你会发现更大的世界 ;)
SystemLight
2021-02-15 23:35:05 +08:00
@superrichman 哈哈,太真实了
cleveryun
2021-02-16 00:15:26 +08:00
jar 的服务器部署真香,比 npm 的方便多了。
geekaven
2021-02-16 00:17:59 +08:00
你这就好比拿文本编辑器比 idea,问为啥 idea 搞那么复杂。
huskar
2021-02-16 01:23:39 +08:00
1.python 语言对应的工具应该是 poetry 或者 pipenv,pip 和这几个不是做同一件事的。
2.java 的 maven 比其他语言的构建工具出现早太多了,可以说其他几个工具都是站在 maven 肩膀上的,所以它们可以取长补短,因此对新人来说觉得这些工具好用很正常。maven 因为出现的早,必然有其历史局限性,比如 maven 使用繁琐的 xml,而后继者普遍采用更简洁的 json,toml 或者 dsl 。
3.这几个语言和构建工具都在用,熟悉了以后觉得其实都差不多,没有什么根本性的差异。楼上有些人硬吹 maven 最好我不敢苟同,我觉得对新手而言,明显是后来出现的构建工具更简单好上手。
sampeng
2021-02-16 03:09:32 +08:00
无知当无谓,用得少就不要评论任何流行工具。

你拿 npm 给我自动生成一套项目模版试试?
你就什么都不动,无脑 npm install 试试?我现在是运维,天天被前端说怎么打包不过去 /线上功能怎么和他测的不一样,就过了一个晚上升级了小版本找谁说理去?

不要抬杠说可以去改配置。拿 npm 所有吐槽点变成正常点后,和 maven/gradle 有啥区别? webpack 配置通俗易懂?来来来,你花一个小时看能不能教一个刚毕业的搞明白 webpack 。maven/gradle 完全没问题,都是结构化的。新人其实很好看明白例子。

前面有说 rust 的,go 的,真的很牛逼么? go mod 发展了几年?最后是怎么诞生的,麻烦你们自己查查资料。真的好用?做自动化构建的时候真的和 java 比一个天上一个地下。rust 现在最蛋疼的就是依赖构建和自动化打包,一下下一堆包不说,项目稍微大点就是半个小时起。别扯本地。都 2021 年了,谁发版从开发电脑上打包?稍微有点团队配合,模块一没分好打包时间就上天了。下载就更不用说了,没科学上网就别想顺利开发。
这还是正常情况,最蛋疼的就是 tokio 版本,经常一不小心整个项目就编译不过去,因为有些老项目不更新 tokio,有些又用的一个版本。然后你自己得有用的最新的,一编译,哦豁,runtime 不匹配我就要去解决版本冲突…maven 解决版本冲突不要太简单

go 写的少,没怎么碰到过坑。

maven 和 gralde 的问题绝壁不是工具本身。xml 配置屎山是人配出来的。


当然,我喜欢 rust,我也讨厌 java,太啰嗦。但不妨碍优秀的东西本身的优秀。很多在 rust 里面得东西我还很希望有类似 java 的 xx 工具,不是使用惯性,我 java 也写的很少。就看点开源项目而已。
sampeng
2021-02-16 03:22:20 +08:00
@SystemLight 另外我给你解释一下为什么 java 需要构建工具,因为 java 在稍微有点规模得公司和写 js 的人的比例都最少是 10:1,你不会以为 java 后端都跟 js 一样都塞一个项目里一个 src 目录完事吧?所以你拿一个只需要几个人开发就完事的和团队作战才行的比,合适么?
HibernatePlus
2021-02-16 05:16:04 +08:00
一不用上大学就能学会的前端能和需要了解计算机原理的 java 相提并论?搞笑呢吧在这
fox0001
2021-02-16 07:51:44 +08:00
我只能说,楼主还是年少气盛。当年我刚毕业,Java 已经出 1.6 了,公司项目还在跑 1.4,甚至更老。因为升级的问题,老板还特意开了个会,提出个观点:能赚钱的代码就是好代码。曾经我觉得作呕的观点,现在算是认同了。

1 )企业需要盈利。盲目跟风升级会带来很多额外的工作(写新代码、测试、培训人员、维护历史版本等),直接浪费很多钱。

2 )项目需要稳定。新功能会带来新 bug 、新漏洞,测试人员不可能 100%覆盖。特别对于结算功能,算错的钱,谁去承担?

3 )更需要关注的是业务功能,满足客户需求。

4 )新人都喜欢炫耀技术(特别是喜欢技术对比,我当年也是这种心态),老人总想着赚钱养家。特别老板要考虑整个公司的发展。

后面公司架构师还是技术升级了,毕竟 Java 1.6 带来实在的好处。但是旧项目就很蛋疼,例如看着好用的新模块,不能直接搬过去。
ebony0319
2021-02-16 09:19:59 +08:00
楼主说的几种包管理我都用过,正常使用 java 稍微复杂一点,但是项目一大,引入的包一多,冲突就多了。很多时候需要选择 a 还是 b,很多时候也要同时保留 a,b 并且保证他们不冲突,有时候需要插件来辅助…java 在这方面真的还是非常先进。
hantsy
2021-02-16 10:40:34 +08:00
@SystemLight 来例子,https://github.com/hantsy/angularjs-springmvc-sample-boot 这个例子大概只有 4,5 年时间,你可以前后编译对比一下 NPM,Maven 的包管理。

另外,https://github.com/hantsy/signup-app 这个差不多快十年了,Maven 一样可以编译。

去年给一个前端项目 Angular 加一个 CI,全部依赖都是 Broken, 开发人员半年一直自己机器上开发,没更新依赖,然后笨号用^的话,更新后完全不兼容,Node 项目相互依赖的版本更敏感。Angular 现在自己有自动升级工具(可以更新相应的依赖),不然的话,自己手动升级,你还得仔细读它的依赖库( rxjs, karma 等)版本多少。
TheWidowMaker
2021-02-16 10:55:52 +08:00
好家伙,真的还有人拿 npm 来给 java 的包管理说事的,这是我万万没想到的
hantsy
2021-02-16 10:58:05 +08:00
@xarthur 觉得 Groovy DSL,Kotlin DSL 来写配置就是灵活???

这些 Maven 早就支持了。https://github.com/takari/polyglot-maven

Atom polyglot-atom
Groovy polyglot-groovy
Clojure polyglot-clojure
Kotlin polyglot-kotlin
Ruby polyglot-ruby
Scala polyglot-scala
YAML polyglot-yaml
Java polyglot-java
XML polyglot-xml

虽然 Gradle 发展这么多年。但是很插件还只是有 Maven 版本,没有 Gradle 支持。生态方面 Gradle 还是不行。
hantsy
2021-02-16 11:02:19 +08:00
习惯方面不用说了,每个人看法不一样。

就之前说那个兼容性我都是受不了 Gradle,但日常我也用,有些项目用什么技术不属于我控制的范围,不然我个人也不产生 20G Gradle Dist 垃圾文件。(我整个下载的 Maven 依赖库也才 20G 左右)

我个人新项目肯定不用 Gradle 的。
hantsy
2021-02-16 11:06:45 +08:00
NPM 比较蠢的是有全局缓存,每个项目中在 node_modules 又再 Copy 一次,硬盘杀手啊。
justin2018
2021-02-16 11:22:23 +08:00
npm 就是一个坑货

使用 npx npkill 释放硬盘空间~

一个月清理一次 可以释放最少 10G 空间

年前把家里的工作机清理了 释放了 100G 的空间 o(╥﹏╥)o

![]( )

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

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

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

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

© 2021 V2EX