1. 从盲侠说起
曾经有有一位盲人叫座头市,他双目失明,但却是一位顶尖的剑客,江湖上没人能接得了他三招,他行侠于江湖,江湖上称他为“盲侠”。
在我们的一线研发同学中,也有不少盲侠。
这些同学在本地进行写代码时,是盲写。他们写的代码尽管全都显示红色警示,写的单测尽管在本地没跑过,但还是照写不误。而且慢慢的练就了,本地写了代码后,不用管语法的错误提示,不用管单测是否能跑,代码提交上去后,能一切编译通过,部署正常。
但这“练就”其实只是大家自己的期望,每次代码提交后,返工的次数还是挺多的。
而且这些同学也不是自己故意装逼要当个“盲侠”,而是逼于无奈。因为他们要研发的应用的代码在本地IDEA环境导入后,依赖解析不全,导致众多红叉。
我们一般的开发流程是,接到一个需求,从主干拉一个分支,再将本地的代码切到这新分支,再刷新IDEA。但有些分支在刷新后,尽管等了30分钟,尽管自己的mac的CPU沙沙直响,热的冒泡,但IDEA的工作区还是有很多红线。这些红线逼我们不少同学走上了“盲侠”之路。
一个maven工程的Java应用,IDEA的导入也是使用了maven的依赖分析。而我们据分析与实际观测,一个需求的开发,即在一个分支上的开发,在本地使用maven的次数绝对比在CICD平台上使用的次数多。
所以本地的maven的性能更需要提升,更需要改造。因为它能带来更大的人效。
我们在“maven构建提速”这一小节中讲了amaven在CICD平台上的解决方案,及它的效果与原理。在这,我们再讲讲amaven如何用在本地,特别是用在本地的IDEA工具中。
2. 解决方案
amaven要结合在本地的IDEA中使用也很方便。
a) 下载amaven最新版本
b) 在本地解压,如目录/Users/userName/soft/amaven-3.5.0
c) 设置Maven home path:
为了充分利用mac的内存资源,建议设置大些的内存:-Xms1538m -Xmx2048m -Xmn768m -XX:SurvivorRatio=10
d) 在应用目录下新建 amaven.config,并写入:
aether.collector.impl=bf amaven.write.log.to.file=true #amaven.log.dir=
amaven.log.dir如不设置,默认是用户目录。建议将这amaven.config提交到分支上,这样同一应用的其他研发同学就不用重复设置了。amaven.config在用户目录中,则它对所有应用生效,如在应用目录中,则优先使用应用目录的,且只能此应用生效。
e) 重启idea后,点import project
最后我们看看效果,对热点应用进行import project测试,用maven要20分钟左右,而用amaven3.5.0在3分钟左右,在命中缓存情况下最佳能到1分钟内。
简单五步后,我们就不用再当“盲侠”了,在本地可以流畅地编码与跑单元测试。
除了在IDEA中使用amaven的依赖分析能力外,在本地通过命令行来运行mvn compile或dependency:tree,也完全兼容apache-maven的。
3. 原理
IDEA是如何调用maven的依赖分析方法的?
在IDEA的源码文件:
中979行,调用了dependencyResolver.resolve(resolution)方法:
dependencyResolver就是通过maven home path指定的maven目录中的DefaultProjectDependenciesResolver.java。
而DefaultProjectDependenciesResolver.resolve()方法就是依赖分析的入口。
IDEA主要用了maven的依赖分析的能力,在“maven构建提速”这一小节中,我们已经讲了一些amaven加速的原理,其中依赖算法从DF换到BF,依赖下载优化,整个依赖树缓存,SNAPSHOT缓存这些特性都是与依赖分析过程相关,所以都能用在IDEA提速上,而依赖仓库mirror等因为在我们自己的本地一般不会删除.m2,所以不会有所体现。
amaven可以在本地结合IDEA使用,也可以在CICD平台中使用,只是它们调用maven的方法的方式不同或入口不同而已。但对于maven协议来说“灵魂”的还是依赖管理与依赖分析。