Java 世界的“烂”包管理

发布于: 2020 年 06 月 20 日
Java世界的“烂”包管理

郁闷至极

郁闷的一天,大好青春都耗在这两个烂仔(IDEA, Maven)身上,吐槽一下,以慰受伤心灵!

回到家里疲惫至极,不禁怀念起 Visual Studio & NuGet 这两个靓仔,说真的,我从来没在这两兄弟身上浪费过一分钟,完美搭档就是不一样。

不就是依赖和引用吗,DLL放在项目目录下,你JAR也不是不可以,搞这么复杂不是脑残吗?要说用户思维,微软完胜这些各自为阵的乌合之众(过了啊,其实也OK),Spring也不知道吃了我多少宝贵时光,回想起来有无数个不眠之夜,苦不堪言。Maven,Gradle也不给力,因为下载不了或网络中断折腾死你。总之,Java、Linux自由世界里你有了自由,还能奢望什么?折腾!

故事是这样的

故事源于重构公司的整个Java开发框架,由于一开始也不知道启用Git子模块(Submodule)功能,把包含很多Maven Module的整个框架源码作为一个项目上传了,发布的时候哪怕改一行代码,也要重新提交到Jenkins上发布,无尽的等待让人立马想踢人,受不了啊!

赶紧的,逐步将各个重要的子模块分离出来,单独发布。问题来了,代码库其实有多份拷贝,Pull一个导致另外一个需要Push,刚开始忍了,怪咱们不专业,但是越来越是可忍熟不可忍!

作为“攻城狮”就得有钻研精神啊,知道Git有Submodule这一说,人家本来就考虑到了项目之间相互依赖的情况下如何管理源代码,Maven也是可以父子模块来编译和构建的,但是怎么配合起来呢?

我想要的效果就是Maven每个Jar Module对应Git一个源码项目,Maven的Pom父Module对应的Git项目仅包含pom.xml及项目配置,没有实际源码,但是方便整体拉代码,编译和构建出所有submodule的jar包。如下图所示:

本地Maven项目和远端服务器Git项目结构映射

目的有:

  1. 方便批量拉取源码

  2. 模块依赖自动更新

  3. 源码组织的够清晰

例如,现在要开发WMS系统,要用到整个框架,我们就这样:

git clone http://xxx.com/framework.git

cd framework

git submodule init

git submodule update

就把整个框架的源码克隆至本地,父子结构的组织方式使得我们不管是整个框架依赖还是部分模块依赖,都能方便批量拉取代码

不管你有几个团队成员,多少个正在开发的应用,始终引用和依赖同一份框架源码库。修改了任何一个子模块源码,所有依赖此模块的项目都能得到更新。例如数据访问层的JDBC项目一旦发布新版本,OAuth和WMS都需要引用新的JDBC项目源码,用GithubDesktop都能获得更新通知

就为了这,开始折腾。啪啪的在IDEA中建父子项目模块结构,GIT上建立分组和项目,都无比流畅啊。感觉大功快告成的时候,在编译和构建时出了个妖怪的问题。我们配置Maven使用了本地存储库(Local Repository),明明JDBC项目已经deploy,本地存储库中也已经有了jar包,可是编译依赖JDBC的OAuth项目时就是报错:Could not resolve dependencies ... was cached in the local repository...

于是网上各种搜,文章各种看,方法各种试……不知不觉搞到夜里11点,书到用时方恨少啊,谁叫咱不把Maven研究透呢,你IDEA也是,是不是你两不配合呢?为啥以前可以呢?我已经不是少年了啊,十万个为什么?

突然间灵光一闪、鬼使神差,我complie/install/deploy整个框架试试,成了!妈耶,这是什么鬼天理?

到现在也不知道为什么,猜测是父子结构的项目Maven需要知道上下文?求高手指点。

无畏折腾

好了,在这点上还是喜欢Visual Studio 和 NuGet,简单就是美

这种无谓的折腾有咱学艺不精之过,但细细想来,如果IDEA自己出一个MavenKiller,绝对不至于这样。之前折腾AndroidStudio+Flutter也是各种坑,为什么说他们是乌合之众,因为各自为阵,每家的产品都各自优秀,但组合在一起就各种不给力,浪费了天下多少有才的“攻城狮”的宝贵青春!

眼球痛啊

发布于: 2020 年 06 月 20 日 阅读数: 73
用户头像

阿喜伯

关注

互联网+工业4.0 2020.04.08 加入

还未添加个人简介

评论

发布
暂无评论
Java世界的“烂”包管理