为什么 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 包管理方案难道就不能简单一点,为何要搞得如此复杂,难道不应该是花费更多精力处理业务逻辑么,包管理搞得如此复杂还要去配置这个东西
18419 次点击
所在节点    Java
158 条回复
zjqzxc
2021-02-15 20:52:03 +08:00
@liprais 解决过,版本冲突也算是常见问题了;一般 requirements.txt 默认都带版本号,配合 virtualenv 食用。
ScepterZ
2021-02-15 20:57:41 +08:00
@hengyunabc go 现在不也是看版本号么
afewok
2021-02-15 21:11:48 +08:00
年轻人,不讲原理,就看谁入门少敲几个字符,就评价,这好嘛?这不好。
superrichman
2021-02-15 21:17:23 +08:00
maven 对新手很不友好,配置环境这一步就能吓退一堆萌新,各种配置的复杂程度根本不适合入门的人去用。

查看 maven 默认配置,卧槽一堆英文,卧槽 xml 文件怎么长得这么难看,马老师,这写的是甚么?

萌新好不容易配置对了,结果一个包半天下不下来,改来改去也不知道哪里出问题。依赖里的某一个文件卡半天下不来,得一层一层找到出问题的文件删了再下,有时候还要重复好几遍,太难了。

依赖 update 半天还是原来的,有时候 clean 好几遍才能
update 成功,有时候还要 force update 。艹,这么多项目都要改,太难了。

还有些奇葩的包不在 mvnrepository,又要做特殊处理,萌新表示太难了。
xarthur
2021-02-15 21:38:06 +08:00
@pursuer gradle 版本多其实也好解决,你设置一下,不要用 gradle wrapper (也就是 gradlew )直接用本地安装的 gradle 跑就行了,gradle wrapper 不是必须的。
abcbuzhiming
2021-02-15 21:38:54 +08:00
其它的我不评论,npm 这个玩意有啥资格来评价 maven
goalidea
2021-02-15 21:45:42 +08:00
java:哇擦,无情,不讲武德! node 年轻人耗子尾汁!
Lemeng
2021-02-15 21:50:32 +08:00
不算复杂
saberlong
2021-02-15 21:53:17 +08:00
@hengyunabc 关于你说的仓库被攻击引入 hash 的问题。java 也存在,任何从仓库下载的都存在篡改问题。而且 go 也能做到从企业内部的仓库下载。
xcstream
2021-02-15 22:00:29 +08:00
不许百度 linux 服务器上
空手写个 web 服务
node 只要 5 分钟
chihiro2014
2021-02-15 22:04:04 +08:00
我一直觉得前端的代码,过了几周就打包不了,maven 还没遇上这种问题
BBCCBB
2021-02-15 22:06:18 +08:00
maven 可以用命令行的
EminemW
2021-02-15 22:07:11 +08:00
不要胡说霸道,依赖文件写好并不需要改配置文件
EminemW
2021-02-15 22:09:01 +08:00
还有 maven gradle 应该叫项目构建工具,并不是包管理工具
ikas
2021-02-15 22:16:50 +08:00
等到他们都实现了 maven/gradle 的功能,回头再来看看,不就又是第二个第三个"maven"么
hantsy
2021-02-15 22:17:38 +08:00
@xarthur 如果说到 Java 内部嘛,Gradle 版本兼容性简直是灾难。各大版本之间配置升级旧的配置格式会被废弃删除,大版本几乎不兼容,想用 Gradle 6.7 去运行 5 时候创建的真实项目,基本上不修改配置不可能运行。Wrapper 就是为了锁定版本,解决了这个问题,但同时也要额外下载相应的 Dist,我的用户目录光 wrapper 下载的 Gradle Dist 都是超过 20G 了。项目如果使用 Gradle,你几乎要时刻更新到最新的 Gradle 格式,以保证你的代码在别人拿到后,可以使用最近半年的 Gradle 成功的 Build 。

但是 Maven 配置的兼容性堪称优秀。Maven 3 运行 10 几年前 Maven 2 程序一样没问题。虽然将要发布的 Maven 4 ( 3.7 版本计划被废弃了)也可能会加入 Wrapper (但个人觉得完全没必要)。

ANT 在 Maven 大规模使用之前一直是 Java 项目实现自动构建的首选。 虽然 Ant 在新项目中几乎没有多少人会采用,但大量的遗留项目一直还在使用 ANT 。ANT 并不是没进化,ANT 下的子项目 IVY 也是用于依赖管理,与 ANT 结合,一样可以利用 Maven 库,自动解决依赖问题。

SBT 和 Gradle 相似,后台一直跑进程,提供一个交互的编译的环境,只是曲高和寡,几乎只有在 Scala 项目用到(个人我也不喜欢)。

(扯远一点,Ivy 虽然可以读取分析 Maven 坐标,但它自己有一套关于依赖的设计理念,早期 Gradle 也是使用 IVY 解析依赖,后来才切换到使用 Maven 兼容方式的,目前似乎 SBT 还在用默认用 IVY 来解析依赖。)
janus77
2021-02-15 22:22:00 +08:00
java 哪来的包管理工具,都是 build 一整套
单纯说 java 的依赖包系统才是最简单的,直接一个 jar 包丢过去,不用编译生成,不用特别写什么,直接就能用。
aureole999
2021-02-15 22:23:30 +08:00
@hengyunabc 正好看的前几天的新闻,这人搞到公司内部用的包名,然后在公共仓库上传了一个同名的,就在 Apple 和微软的内部服务器上成功执行了代码。至少这点上 Go 还没那么容易,不是一个同名的包就行。而且这人说最容易搞到的内部包名就是从一些网站的 js 文件里找到,所以他攻击成功的有 75%是 npm 。

https://medium.com/@alex.birsan/dependency-confusion-4a5d60fec610
royzxq
2021-02-15 22:39:40 +08:00
不是,说前端项目过几周就打包不了的是不是项目里都不用 yarn.lock / package-lock.json ?
SystemLight
2021-02-15 22:54:24 +08:00
@liprais pipenv 独立配置环境不行么

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

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

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

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

© 2021 V2EX