《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协议来说“灵魂”的还是依赖管理与依赖分析。

相关文章
|
4天前
|
前端开发 Java 测试技术
Java一分钟之Spring MVC:构建Web应用
【5月更文挑战第15天】Spring MVC是Spring框架的Web应用模块,基于MVC模式实现业务、数据和UI解耦。常见问题包括:配置DispatcherServlet、Controller映射错误、视图解析未设置、Model数据传递遗漏、异常处理未配置、依赖注入缺失和忽视单元测试。解决这些问题可提升代码质量和应用性能。注意配置`web.xml`、`@RequestMapping`、`ViewResolver`、`Model`、`@ExceptionHandler`、`@Autowired`,并编写测试用例。
51 3
|
4天前
|
Java 测试技术
Java一分钟之-正则表达式在Java中的应用
【5月更文挑战第14天】正则表达式是Java中用于文本处理的强大力量,通过`java.util.regex`包支持。常见问题包括元字符的理解、边界匹配和贪婪/懒惰量词的使用。错误通常涉及未转义特殊字符、不完整模式或过度匹配。要避免这些问题,需学习实践、使用在线工具和测试调试。示例代码展示了如何验证邮箱地址。掌握正则表达式需要不断练习和调试。
17 2
|
1天前
|
Java
深入理解Java并发编程:线程池的应用与优化
【5月更文挑战第18天】本文将深入探讨Java并发编程中的重要概念——线程池。我们将了解线程池的基本概念,应用场景,以及如何优化线程池的性能。通过实例分析,我们将看到线程池如何提高系统性能,减少资源消耗,并提高系统的响应速度。
11 5
|
1天前
|
算法 搜索推荐 Java
滚雪球学Java(33):数组算法大揭秘:应用案例实战分享
【5月更文挑战第8天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
21 8
滚雪球学Java(33):数组算法大揭秘:应用案例实战分享
|
2天前
|
IDE Go 开发工具
【GO基础】2. IDEA配置Go语言开发环境
【GO基础】2. IDEA配置Go语言开发环境
|
2天前
|
自然语言处理 Java API
Java 8的Stream API和Optional类:概念与实战应用
【5月更文挑战第17天】Java 8引入了许多重要的新特性,其中Stream API和Optional类是最引人注目的两个。这些特性不仅简化了集合操作,还提供了更好的方式来处理可能为空的情况,从而提高了代码的健壮性和可读性。
24 7
|
2天前
|
数据采集 监控 安全
java数字工厂MES系统全套源码Java+idea+springboot专业为企业提供智能制造MES解决方案
"MES" 指的是制造执行系统(Manufacturing Execution System)。MES在制造业中扮演着至关重要的角色,它是位于企业资源计划(ERP)系统和车间控制系统之间的系统,用于实时收集、管理、分析和报告与制造过程相关的数据。
10 0
|
3天前
|
安全 Java Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【5月更文挑战第16天】 在移动开发领域,性能一直是开发者关注的焦点。随着Kotlin语言的普及,其与Java在Android应用中的性能表现成为热门话题。本文将深入分析Kotlin和Java在Android平台上的性能差异,并通过实际测试数据来揭示二者在编译速度、应用启动时间以及运行效率方面的表现。我们的目标是为开发者提供一个参考依据,以便在选择合适的编程语言时做出更加明智的决策。
|
4天前
|
Java 开发工具 Maven
java解析apk获取应用信息
请注意,你需要替换"path/to/your/apkfile.apk"为你的APK文件的实际路径。
11 0
|
4天前
|
Java 编译器 开发者
Java一分钟之-Java注解的理解与应用
【5月更文挑战第12天】本文介绍了Java注解的基础知识和常见应用,包括定义、应用和解析注解。注解在编译检查、框架集成和代码生成等方面发挥重要作用。文章讨论了两个易错点:混淆保留策略和注解参数类型限制,并提供了避免策略。提醒开发者避免过度使用注解,以保持代码清晰。理解并恰当使用注解能提升代码质量。
14 3