《Java应用提速(速度与激情)》——二、本地IDEA环境提速

简介: 《Java应用提速(速度与激情)》——二、本地IDEA环境提速

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

 

image.png 

 

为了充分利用mac的内存资源,建议设置大些的内存:-Xms1538m -Xmx2048m -Xmn768m -XX:SurvivorRatio=10

 

image.png

 

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

 image.png

 

最后我们看看效果,对热点应用进行import project测试,用maven要20分钟左右,而用amaven3.5.0在3分钟左右,在命中缓存情况下最佳能到1分钟内。

 

简单五步后,我们就不用再当“盲侠”了,在本地可以流畅地编码与跑单元测试。

 

除了在IDEA中使用amaven的依赖分析能力外,在本地通过命令行来运行mvn compile或dependency:tree,也完全兼容apache-maven的。

 

3. 原理

 

IDEA是如何调用maven的依赖分析方法的?

 

在IDEA的源码文件

https://github.com/JetBrains/intellij-community/blob/1e1f83264bbb4cb7ba3ed08fe0915aa990231611/plugins/maven/maven3-server-impl/src/org/jetbrains/idea/maven/server/Maven3XServerEmbedder.java

中979行,调用了dependencyResolver.resolveresolution方法:

 

image.png

 

dependencyResolver就是通过maven home path指定的maven目录中的DefaultProjectDependenciesResolver.java。

 

image.png

 

而DefaultProjectDependenciesResolver.resolve()方法就是依赖分析的入口。

 

IDEA主要用了maven的依赖分析的能力,在“maven构建提速”这一小节中,我们已经讲了一些amaven加速的原理,其中依赖算法从DF换到BF,依赖下载优化,整个依赖树缓存,SNAPSHOT缓存这些特性都是与依赖分析过程相关,所以都能用在IDEA提速上,而依赖仓库mirror等因为在我们自己的本地一般不会删除.m2,所以不会有所体现。

 

amaven可以在本地结合IDEA使用,也可以在CICD平台中使用,只是它们调用maven的方法的方式不同或入口不同而已。但对于maven协议来说“灵魂”的还是依赖管理与依赖分析。

相关文章
|
9天前
|
Java
使用IDEA创建项目运行我的第一个JAVA文件输出Helloword
本文介绍了如何使用IDEA(IntelliJ IDEA)创建一个新的Java项目,并运行一个简单的Java程序输出"Hello Word"。文章详细展示了创建项目的步骤,包括选择JDK版本、设置项目名称和路径、创建包和类,以及编写和运行代码。最后,还展示了如何通过IDEA的运行功能来执行程序并查看输出结果。
30 4
使用IDEA创建项目运行我的第一个JAVA文件输出Helloword
|
7天前
|
消息中间件 分布式计算 Java
Linux环境下 java程序提交spark任务到Yarn报错
Linux环境下 java程序提交spark任务到Yarn报错
17 5
|
4天前
|
Java 测试技术
Java接口的生产环境应用注意点
在Java生产环境中,合理使用接口对提升代码质量至关重要。设计接口时应遵循单一职责原则,采用清晰命名,并控制方法数量。默认方法应谨慎使用,避免与实现类产生冲突。通过版本化管理接口更新,确保向后兼容。实现接口时需明确行为,保持实现与接口分离,利用多态增强灵活性。关注性能影响,适当文档注释及充分测试确保接口稳定可靠。综合运用这些策略,可以显著提高系统的可扩展性和维护性。
|
7天前
|
Java Linux Python
Linux环境下 代码java调用python出错
Linux环境下 代码java调用python出错
20 3
|
7天前
|
JavaScript 前端开发 Java
Java 8 新特性详解及应用示例
Java 8 新特性详解及应用示例
|
10天前
|
缓存 负载均衡 Dubbo
Dubbo技术深度解析及其在Java中的实战应用
Dubbo是一款由阿里巴巴开源的高性能、轻量级的Java分布式服务框架,它致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。
32 6
|
7天前
|
Java API
Java中的Lambda表达式及其应用
本文将深入探讨Java中的Lambda表达式,通过简洁易懂的语言和示例代码,帮助读者理解Lambda表达式的定义、优势以及在实际开发中的应用。同时,我们将解析一些常见的使用场景,并展示如何利用Lambda表达式简化代码,提高编程效率。
18 2
|
10天前
|
Java 开发者
Java中的多线程基础与应用
【9月更文挑战第22天】在Java的世界中,多线程是一块基石,它支撑着现代并发编程的大厦。本文将深入浅出地介绍Java中多线程的基本概念、创建方法以及常见的应用场景,帮助读者理解并掌握这一核心技术。
|
6天前
|
Oracle Java 关系型数据库
Linux下JDK环境的配置及 bash: /usr/local/java/bin/java: cannot execute binary file: exec format error问题的解决
如果遇到"exec format error"问题,文章建议先检查Linux操作系统是32位还是64位,并确保安装了与系统匹配的JDK版本。如果系统是64位的,但出现了错误,可能是因为下载了错误的JDK版本。文章提供了一个链接,指向Oracle官网上的JDK 17 Linux版本下载页面,并附有截图说明。
Linux下JDK环境的配置及 bash: /usr/local/java/bin/java: cannot execute binary file: exec format error问题的解决
|
4天前
|
Java 数据中心 微服务
Java高级知识:线程池隔离与信号量隔离的实战应用
在Java并发编程中,线程池隔离与信号量隔离是两种常用的资源隔离技术,它们在提高系统稳定性、防止系统过载方面发挥着重要作用。
5 0
下一篇
无影云桌面