IntelliJ IDEA,是java编程语言开发的集成环境。IntelliJ在业界被公认为最好的java开发工具,尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能可以说是超常的。
如今构建工具是一切项目的重要组成部分,而IntelliJ IDEA已与大多数构建工具集成,目前流行的构建工具是Gradle。在本文中,我们简要介绍一下它与IntelliJ IDEA的集成历史以及IDE内实现的委托流程。
IntelliJ IDEA v2023.1正式版下载
起点
IntelliJ IDEA 的上市时间比其他构建工具都要早,多年来一直提供其原生构建系统并取得了巨大成功。 IntelliJ IDEA 构建系统始终是编译、运行测试和打包到 JAR 等任务的最佳选择。
开发者通常主要关注编译和运行测试,因此构建流程的快速反馈周期至关重要,而我们则擅长执行 JUnit 和 TestNG 测试以及增量编译。
Gradle之前
Maven 推出时表现出强大的项目依赖项管理能力,我们利用了它的项目结构,并将下载和解析依赖项委托给 Maven(但将构建流程留给 IntelliJ IDEA)。
我们能够在 IntelliJ IDEA 构建系统中复制 Maven 的构建流程,基于 Maven 项目模型,IntelliJ IDEA 可以用最少的额外步骤构建项目。同时我们开发了有效检索资源处理信息的机制,覆盖从 pom.xml 生成 MANIFEST.mf 文件,进一步增强了构建流程。
然后,我们将构建流程的结果应用到执行测试的原生流程。
借助这项改进,我们得以涵盖使用IntelliJ IDEA成功构建Maven项目的所有必要场景。
继续对Maven项目使用这种设置:从Maven检索必要信息,使用原生IntelliJ IDEA机制构建和启动项目,甚至对Spring Boot和 Micronaut等流行工具也是如此。
集成Gradle
当Gradle在市场上推出时,它让用户能够更好地自定义构建流程并为其添加更多功能。
当时决定开始采用与Maven类似的方式时,这意味着让 Gradle 处理依赖项和检索必要信息,而 IntelliJ IDEA 将编译代码、运行测试和构建项目。
不过Gradle项目模型似乎有些过于灵活,您可以在构建脚本中使用不同的源集或语言,例如Groovy、Scala或Kotlin。 另外,在构建脚本中还可以编写命令式代码,为构建系统提供所需行为和设置的直接指令。
例如可以在运行之前或测试运行之前启动数据库,另外与包含静态配置的Maven相比,Gradle构建脚本允许在资源处理期间执行任意代码,使用IntelliJ IDEA 功能很难重现此类配置。
显然在标准操作方面表现出色,但自定义操作,例如处理资源和其他自定义任务,对我们来说相当难以控制和维护,最重要的是难以在 IntelliJ IDEA 构建系统中复制。
因此,我们决定将测试运行委托给 Gradle:
当您运行测试时,Gradle test任务将与属于Gradle构建周期的其他任务一起执行,如下所示:
此外IntelliJ IDEA 还提供了额外功能,举例来说,您需要运行的测试可能分布在不同源集中。 集成测试在一个源集中,而功能测试则在另一个源集中。
IntelliJ IDEA 能够正确确定特定测试文件的测试任务及其位置,确保相关测试有效执行。
此外IntelliJ IDEA还提供测试执行级别的信息 – 方法、类或软件包,例如Gradle 默认执行源集中的所有测试。
但是IntelliJ IDEA会应用筛选模式,并在 Run(运行)工具窗口中显示消息,告知您执行测试的确切位置:
总体而言,Gradle 的测试委托相当成功。
下一步自然是将 Build(构建)和 Run(运行)操作也委托给 Gradle,最终委托成为默认选择。
现在,在应用程序中使用 Run(运行)操作时,它会在 Gradle 上下文中使用并动态完成。
类似于现有 Gradle 应用程序插件,我们正在创建运行主类的 JavaExec 类型的任务,这可以确保应用程序运行配置的最大正确性。
在委托模式下触发 Build(构建)时,IntelliJ IDEA 会根据项目中被修改的模块在 Gradle 中生成需要执行的命令列表,您可以在BuildOutput中查看此信息:
IntelliJ IDEA 还可以检测在不同模块中修改的文件并仅构建修改的部分。
目前,有两种委托模式可供选择:Gradle 和 IntelliJ IDEA。
- Gradle:当流程委托给 Gradle 时,它比我们的原生构建系统稍慢,并且存在少量开销。 有时,在委托模式下,Gradle 守护进程需要重新运行。
此外,Gradle 会保留其生命周期进程,重新运行 Gradle 模型并检查构建脚本及其文件系统,即使存在由 IntelliJ IDEA 编译的代码。 - IntelliJ IDEA:如果 Gradle 项目中没有复杂的设置,可以使用 IntelliJ IDEA 加快构建流程。
还要注意在编译流程中支持注解处理,不过当代码由IntelliJ IDEA 编译时,有一些边缘情况很难处理,例如注解处理程序在 Gradle 子项目中定义的情况。
这就是我们现在所处的阶段,仍在尝试以委托模式运行Spring和Micronaut运行配置,并在IDE中持续改进Gradle委托流程。