1.【Gradle多模块系列2】在子项目之间声明依赖关系和共享构建逻辑示例详解
2.项目构建 - Gradle 编译原理 -1
3. gradle源码系列3Project用法示例方法总结源码分析
4.读spring源码,关联为什么要用gradle构建。直接导入idea不行吗?源码源码
5.Spring源码 1.源码的下载与编译(by Gradle)
【Gradle多模块系列2】在子项目之间声明依赖关系和共享构建逻辑示例详解
源自专栏《 Gradle ScalaTest markdown idea Git中文实用教程目录?》
一、在子项目之间声明依赖关系
1. 项目依赖关系
如果一个项目在编译classpath中需要另一个项目生成的分析jar文件怎么办?
如果它还需要另一个项目的传递依赖项怎么办?
很明显,这是关联Java多项目构建中非常常见的用例。如前所述,源码源码在项目依赖关系中,分析收款猫源码Gradle提供了项目依赖关系。关联
例1. 项目依赖关系
我们有shared、源码源码api和person-service三个项目。分析person-service项目依赖于其他两个项目。关联api项目依赖于shared项目。源码源码它没有构建脚本,分析并且没有被其他构建脚本注入任何内容。关联我们使用冒号分隔符来定义项目路径。源码源码有关定义项目路径的分析更多信息,请参阅Settings.include(java.lang.String[])的DSL文档。
settings.gradle文件的内容如下:
buildSrc/src/main/groovy/myproject.java-conventions.gradle文件中的内容如下:
api/build.gradle文件中的内容如下:
shared/build.gradle文件中的内容如下:
services/person-service/build.gradle文件中的内容如下:
共享的构建逻辑被提取到一个约定插件中,在子项目的构建脚本中应用该插件并定义了项目依赖关系。
项目依赖关系是执行依赖关系的一种特殊形式。
它会先构建其他项目,然后将其他项目的包含类的jar文件添加到类路径中。它还将其他项目的依赖项添加到类路径中。您可以触发gradle :api:compile命令。首先构建shared项目,然后构建api项目。项目依赖关系使得部分多项目构建成为可能。
2. 依赖于另一个项目产生的构件
项目依赖关系模型化了模块之间的依赖关系。
实际上,您是在说您依赖于另一个项目的主要输出。
在基于Java的项目中,通常是移除id源码一个JAR文件。
有时,您可能希望依赖于另一个任务生成的输出。反过来,您将希望确保先执行该任务以生成该输出。从一个项目到另一个项目声明任务依赖关系是一种不好的建模方式,并且引入了不必要的耦合。建议建模此类依赖关系的方法是生成输出,将其标记为“输出”构件或将其添加到主源集的输出中,然后您可以在使用该构件的消费者项目中进行依赖。
假设您正在一个包含两个子项目producer和consumer的多项目构建中工作。子项目producer定义了一个名为buildInfo的任务,用于生成包含构建信息(例如项目版本)的属性文件。然后,您可以将任务提供程序映射到其输出文件,并且Gradle将自动建立任务依赖关系。
2.1例2. 生成包含构建信息的属性文件的任务
consumer项目应该能够在运行时读取属性文件。通过在消费者项目中声明对生产者项目的项目依赖关系,可以确保在之前创建属性并将其提供给运行时类路径。
2.2例3. 声明对生成属性文件的项目的项目依赖关系
在上面的例子中,消费者项目现在声明对生产者项目输出的依赖关系。
依赖于另一个项目的主要输出构件只是一个例子。
Gradle拥有最强大的依赖管理引擎之一,允许您在项目之间共享任意构件,并让Gradle按需构建它们。有关更多详细信息,请参阅关于在项目之间共享输出的部分。
二、在子项目之间共享构建逻辑
1. 约定插件
通常,在多项目构建中,子项目之间共享一些共同的遮眼页面源码特征。例如,几个子项目可能包含特定编程语言的代码,而另一个子项目可能专门用于文档。代码质量规则适用于所有代码子项目,但不适用于文档子项目。同时,具有共同特征的子项目可能具有不同的目的 - 它们可能产生不同的构件类型,进一步区分它们,例如:
其他一些代码子项目可能专门用于测试等。
上述特征确定了子项目的类型,或者换句话说,子项目的类型告诉我们该项目具有哪些特征。
Gradle组织构建逻辑的推荐方式是使用其插件系统。
插件应定义子项目的类型。实际上,Gradle的核心插件也是以相同方式进行建模的 - 例如,Java插件配置了通用的Java项目,而Java Library插件在内部应用Java插件,并在此基础上配置了特定于Java库的方面。类似地,Application插件应用并配置Java插件和Distribution插件。
您可以通过应用和配置核心和外部插件来组合自定义构建逻辑,并创建自定义插件来定义新的项目类型并配置特定于项目或组织的约定。对于本节开头的每个示例特征,我们可以编写一个插件,将通用逻辑封装在给定类型的子项目中。
我们建议将约定插件的源代码和测试放在项目根目录的特殊buildSrc目录中。有关buildSrc的更多信息,请参阅使用buildSrc组织构建逻辑。
请查看示例,c/s源码演示了如何使用约定插件对构建逻辑进行建模的多项目构建。
另一个更复杂、实际的多项目构建的示例,它使用约定插件组合构建逻辑,是Gradle Build Tool自身的构建。
2. 跨项目配置
另一种不鼓励的共享构建逻辑的方法是通过subprojects { }和allprojects { } DSL结构进行跨项目配置。通过跨配置,构建逻辑可以注入到子项目中,当查看子项目的构建脚本时,这并不明显,这使得更难理解特定子项目的逻辑。从长远来看,跨配置通常会越来越复杂,有越来越多的条件逻辑和更高的维护负担。跨配置还可能引入项目之间的配置时间耦合,这可能会阻止像按需配置这样的优化正常工作。
有两种最常见的跨配置用法,可以使用约定插件更好地进行建模:
3. 在子项目之间共享构建逻辑示例
3.1 使用案例
以一个具有三个子项目的项目为例,其中两个子项目生成了作为内部共享库使用的两个公共Java库。这是项目结构:
假设我们的所有项目都将是Java项目。在这种情况下,我们希望对它们都应用一组通用规则,例如源代码目录布局、编译器标志、代码风格约定、代码质量检查等等。
三个项目中有两个不仅仅是Java项目 - 它们是我们可能希望发布到外部存储库的库。发布配置,例如库的通用组名称以及存储库坐标,可能是源码泄露实例两个库需要共享的横切关注点。对于此示例,假设我们还想强制执行我们的库公开了一些具有共同结构的文档。
3.2 组织构建逻辑
根据上面的使用案例,我们确定了两种类型的项目 - 通用的Java项目和公共库。我们可以通过分层两个单独的插件来模拟此使用案例,每个插件定义应用它们的项目类型:
内部库子项目应用myproject.java-conventions插件:
两个公共库子项目应用myproject.library-conventions插件:
注意如何将约定插件应用于子项目有效地声明了其类型。通过应用myproject.java-conventions插件,我们声明:这是一个“Java”项目。通过应用myproject.library-conventions插件,我们声明:这是一个“Library”项目。
此示例中的所有插件都包含使用TestKit进行功能测试以验证其行为。
此示例没有任何项目源代码,只是布置了一个假设的项目结构,其中两个库子项目依赖于一个共享的内部子项目。
3.3 编译约定插件
在此示例中,约定插件被实现为预编译的脚本插件 - 这是最简单的方法,因为您可以直接使用Gradle的DSL之一来实现构建逻辑,就像插件是常规的构建脚本一样。
为了发现预编译的脚本插件,buildSrc项目需要在其build.gradle文件中应用groovy-gradle-plugin插件:
3.4 注意事项
3.4.1 在预编译的脚本插件中应用外部插件
myproject.java-conventions插件使用SpotBugs插件执行静态代码分析。
SpotBugs是一个外部插件 - 在预编译的脚本插件中应用外部插件之前,需要将它们作为实现依赖项添加:
插件的依赖项坐标(GAV)可能与插件id不同。
Gradle插件门户网站(gradlePluginPortal())被添加为插件依赖项的仓库。
插件版本从依赖项版本确定。
添加依赖项后,可以通过id在预编译的脚本插件中应用外部插件:
3.4.2 应用其他预编译的脚本插件
预编译的脚本插件可以应用其他预编译的脚本插件。
myproject.library-conventions插件应用了myproject.java-conventions插件:
3.4.3 使用主源集中的类
预编译的脚本插件可以使用插件项目的主源集中定义的类。
在此示例中,myproject.library-conventions插件使用了buildSrc/src/main/java中的自定义任务类来配置库README检查:
参考链接
docs.gradle.org/8.2.1/u...
docs.gradle.org/8.2.1/u...
docs.gradle.org/8.2.1/s...
项目构建 - Gradle 编译原理 -1
Gradle是一种强大的项目构建工具,其基础原理包括Task任务定义、组成以及依赖关系。这些任务涵盖了从代码编译、资源处理到测试运行的各个环节,以有向无环图(DAG)的形式组织,确保了构建过程的有序执行。
一个任务由Action(处理逻辑,如编译或复制)、Input(操作所依赖的值和文件)和Output(操作结果)三部分构成。例如,编译Java源代码的任务(compileJava)和复制资源文件的任务(processResources)是构建流程中的基本单元。
任务之间的依赖关系至关重要,例如,classes任务需要先执行processResources和compileJava。常见的Gradle任务如compileJava(编译Java源代码)、processResources(处理资源文件)、testClasses(编译和复制测试资源)等,每个任务都有其特定的作用和依赖关系。
创建一个简单的Gradle项目时,你需要在build.gradle文件中定义任务和依赖,如clean(清理项目目录)、assemble(组装项目文件)和build(执行完整构建)。通过执行gradle命令,你可以轻松地管理这些任务并监控构建过程。
gradle源码系列3Project用法示例方法总结源码分析
Gradle Project用法示例方法总结
Gradle的核心接口Project是构建文件与Gradle交互的核心API,通过它,开发者可以程序化地访问Gradle的所有功能,进行高效构建操作。项目生命周期
每当进行构建时,每个相关项目都会在其生命周期内创建一个Project实例。这个过程在构建初始化阶段发生。任务管理
项目本质上由一系列Task组成,如编译、测试和打包等。Task可通过TaskContainer的create()方法添加,如TaskContainer.create(String)。此外,通过getByName(String)可以定位已存在的任务。依赖关系与配置
项目依赖于其他模块或构件,这些通过配置分组。使用ConfigurationContainer管理配置,DependencyHandler管理依赖,ArtifactHandler管理构件,RepositoryHandler管理仓库。这些操作可以通过对应的方法轻松完成。多项目构建
项目在层次结构中组织,每个项目由名称和完全限定路径标识。这种结构支持复杂的多项目协作。插件应用
通过PluginAware.apply()方法或使用插件脚本块,插件可增强项目的配置和功能复用性。动态属性与方法
在构建文件中,所有属性和方法调用都会绑定到Project实例,这意味着可以直接使用Project接口进行操作。额外属性通过"ext"命名空间定义,可用于读写。方法作用域示例
实际操作中,Project类提供了丰富的功能,如设置属性、配置依赖、创建任务和获取子项目等,下面的示例展示了这些功能的运用。读spring源码,为什么要用gradle构建。直接导入idea不行吗?
在Spring源码开发中,选择使用Gradle构建项目是出于提高构建效率的目的。相较于Maven,Gradle能显著缩短项目构建所需时间,为开发者节省大量等待时间,从而更高效地完成代码修改与功能实现。
下载Gradle的具体版本至关重要,需根据Spring源码的版本确定,通过GitHub查找对应版本。例如,若Spring源码版本需配合JMH-gradle-plugin的0.6.6版本,则Gradle版本应为6.8及以上,确保插件与Gradle版本兼容,避免构建过程中出现错误。不兼容可能导致“Only Project build scripts can contain plugins { } blocks”等异常。
面对新版本Spring源码的编译需求,建议更新至JDK,但若偏好使用JDK8,可继续参考后续内容。通常,JDK8建议与5.0-5.6.4版本的Gradle配合使用,以减少因版本不兼容导致的问题,提高学习与开发效率。
正确安装Gradle,首先从下载地址获取安装包,双击解压后,需在`.bash_profile`文件中添加环境变量。在命令行输入`gradle`测试安装,如出现错误则需执行`java -version`确认JDK版本,并通过`source ~/.bash_profile`刷新环境变量,重新尝试安装。
配置IDEA构建时,选择本地Gradle路径、指定本地Gradle安装位置及本地JDK版本,确保项目构建顺利进行。
最后,检查编译结果,无错误即表示编译成功。如编译速度慢,可考虑修改镜像配置,通过在`settings.gradle`文件中添加阿里云镜像仓库及在`build.gradle`文件中进行相关设置,优化构建过程,提高效率。
Spring源码 1.源码的下载与编译(by Gradle)
为了获得Spring源码并成功编译,我们首先需要下载源码。方法之一是使用Git clone命令,前提是我们已安装Git。但要注意,最新版本可能需要JDK ,若需使用JDK 8,推荐选择较旧版本。GitHub上,最新稳定版本为5.2..RELEASE,这是一个GA(General Availability)版本,表示正式发布的版本,适合在生产环境中使用。如果你使用的是JDK 8,建议选择分支版本。
如果GitHub服务不可用或下载速度缓慢,可以考虑从其他资源库下载。例如,可以使用csdn提供的资源链接支持作者,或者直接从gitee下载源码。
下载源码后,导入IDEA并选择Gradle工程。IDEA会自动加载,但可能遇到一些报错。如果报错提示“POM relocation to an other version number is not fully supported in Gradle”,需要将xml-apis的版本号更改为1.0.b2。这可以通过在项目的build.gradle文件中添加指定版本的代码来实现。
加载并配置新模块后,可以通过新建测试类来进行验证。在build.gradle中添加配置,并在模块中新建文件,包括一个启动类、一个配置类和一个实体类。记得刷新Gradle,进行测试。
测试结果应显示新建的实体类已被Spring容器加载。如果在测试中遇到问题,可以通过检查编译工具、编译器和项目结构来解决。确保使用本地Gradle路径、选择JDK 1.8版本,并在项目设置中选择正确的JDK版本。