为什么 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 包管理方案难道就不能简单一点,为何要搞得如此复杂,难道不应该是花费更多精力处理业务逻辑么,包管理搞得如此复杂还要去配置这个东西
20256 次点击
所在节点    Java
158 条回复
Actrace
2021-02-16 15:46:07 +08:00
没有包管理其实就是最好的包管理。

想想以前 PHP 为什么能流行起来,就是因为它把绝大多数需要用到的工具都打包好了。
虽然现在又有人作妖搞什么 composer,不过不影响它依旧好用的特性。
siweipancc
2021-02-16 16:37:31 +08:00
作为一个强迫症,每次拿到库都是先撸源代码,然后被前端大姐嫌弃,也经常被后端组长吐槽浪费时间。(最近修了一大堆前后端的祖传 bug 之后就没挨喷了)。跑题了不好意思
gaoshiba
2021-02-16 16:52:20 +08:00
最烦 java if(xx!=null)xx.close(),为什么就不能直接帮我在方法里判断呢。
sheeta
2021-02-16 16:56:15 +08:00
@gaoshiba 哈哈,现在稍微好点了,有 try with resource
gaoshiba
2021-02-16 16:59:58 +08:00
@sheeta 哦吼,学到新东西了。早上才把我上面提到的那些代码全部删了,修改实现方式,改成了不需要 close 的方法,hh
momocraft
2021-02-16 17:19:51 +08:00
maven 学会一次能用十年,真的比每十个月重新学习 webpack 更复杂吗
sutra
2021-02-16 17:31:11 +08:00
多学习,可以不那么狭隘。
NXzCH8fP20468ML5
2021-02-16 17:47:51 +08:00
我会 msbuild,cargo,npm,pip 不会 maven,go mod 怎么办
EminemW
2021-02-16 17:58:14 +08:00
@blless 想问一下没有 pkg.go.dev 之前,go 的包怎么查版本号
mogg
2021-02-16 18:17:15 +08:00
@EminemW git branch / tag
mogg
2021-02-16 18:21:51 +08:00
go module 是真的舒服,一方面 go 的编译是真的快,另一方面源码编译让 go 作为编译型语言还不用考虑跨平台的问题,自定义功能~~抄代码~~也方便
xarthur
2021-02-16 18:46:55 +08:00
@hantsy 不牵强啊……
官方说的很清楚了
"We call this build.gradle file a build script, although strictly speaking it is a build configuration script, as we will see later. The build script defines a project and its tasks.

To try this out, create the following build script named build.gradle."
https://docs.gradle.org/current/userguide/tutorial_using_tasks.html
而且在具体运行的时候也是和脚本一样一行一行执行的。
halk
2021-02-16 21:51:50 +08:00
前端代码写得少,但公司的前端项目总是编译失败,各种包下载不下来。。
Aoang
2021-02-16 22:53:45 +08:00
提一下 Golang 的依赖管理。

在过去,Golang 没有官方的 go mod,那时候依赖管理都是一塌糊涂,然后渐渐的出现了很多第三方包管理器,但是没有一个好用的。
除开包管理器,也有人做了版本管理来控制版本,以此来凑活,gopkg.in 因此诞生,用这个做版本管理的库还不少,比如 go yaml 等等。

go mod 出来之后,一切都变好了吗?然而并没有,只是大部分情况下变好了。
它对库的规范很严格,很多库因为之前没有版本管理,都使用的一些骚操作来实现版本管理。比如,用 v1 v2 这种目录的形式来管理版本。

一些库开启了 go mod 之后,各种历史遗留原因加上循环依赖,灾难就降临了

最典型的例子就是 etcd 了,etcd, grpc, viper 循环依赖…,碰到过的人,肯定都觉得坑爹

想解决这个问题,只能一个个 replace,但是后续升级依赖,可能就又会碰到这个问题了。

只要项目复杂,包管理器再好用…也会变得复杂,只能从源头上处理这个问题,不要随意使用第三方库,非要用的情况下,要进行多方面考虑。
比如,库的活跃程度,库是否引用了第三方库,库引用的第三方库是否引用了第三方库……
wiix
2021-02-17 01:08:51 +08:00
@gaoshiba try-with-resource 语法都出来快 10 年了,你不学不用让怎么帮你,对吧……
Mithril
2021-02-17 01:14:41 +08:00
你说别的我也就信了。。npm ???
sunzhenyucn
2021-02-17 08:10:48 +08:00
构建工具和包管理器怎么会有可比性?写 Go 我还在用 GNU Make 来帮助软件构建,并没有感觉比 Maven 方便到哪里去。
sampeng
2021-02-17 08:39:33 +08:00
@Jirajine cargo 只是编译工具,构建工程是 build.rs 。虽然这样一来无限的可能,但是,体验远远不如 gralde 直接的 dsl 去写。兼容性的坑在任何工具都会出现,只是多少问题。从整体上看,maven/gradle 开箱即用还是很舒服的。
jeffwcx
2021-02-17 10:06:58 +08:00
@hengyunabc npm 又不是拿来打包的,webpack 打包现在都有 treeshaking,不可能一打包就是几百兆吧
tommyzhang
2021-02-17 10:19:05 +08:00
npm 这种二把刀也好意思说

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

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

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

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

© 2021 V2EX