51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 828|回复: 0
打印 上一主题 下一主题

[转贴] get到Gradle及多模块定制化统一配置实现将会无法离开你知道吗?

[复制链接]
  • TA的每日心情
    无聊
    2024-10-29 09:20
  • 签到天数: 76 天

    连续签到: 1 天

    [LV.6]测试旅长

    跳转到指定楼层
    1#
    发表于 2022-8-9 14:47:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    【学习背景】
    相信做过实际项目或者学过项目的小伙伴,都听说过依赖构建工具,目前项目中用得最多的两种构建依赖构建方式分别是Maven和Gradle,至于哪种日出冲天,哪种日薄西山,这个说不准,我觉得现在实际上两种都使用得挺多的,只不过Maven出道得早一些,而Gradle是后起之秀,今天就来介绍一下这个后起之秀Gralde的使用,主要基于Spring Boot官方提供的gradle demo进行说明,将教你如何快速上手一个Gradle工程,并根据实际需要进行单模块的配置以及多模块的配置,甚至是定制化多模块的配置方案,希望对你有所帮助。


    学习目录一、单模块
    1.1 生成demo
    1.2 gradle配置说明
    1.3 构建demo
    二、传统多模块(多配置)
    2.1 添加子模块
    2.2 构建单模块
    2.3 构建多模块
    三、定制多模块(单配置)
    3.1 定制化说明
    3.2 定制化配置
    3.3 构建多模块(定制化)



    一、单模块1.1 生成demo

    直接通过SpringBoot官方快速创建一个demo工程 https://start.spring.io/

    将demo工程导入IDEA或Eclipse等集成开发工具,得到的结构大致如下

    1. demo
    2. ├─src
    3. ├─build.gradle
    4. ├─settings.gradle
    复制代码

    1.2 gradle配置说明

    关于Gradle依赖构建,我们主要关注build.gradle、settings.gradle这两个配置,配置说明如下:
    settings.gradle

    1. //Gradle工程名
    2. rootProject.name = 'demo'
    复制代码

    build.gradle配置内容及说明:

    1. //依赖的插件
    2. plugins {
    3.         id 'org.springframework.boot' version '2.5.4'
    4.         id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    5.         id 'java'
    6. }
    7. //组名(前缀包名)
    8. group = 'com.example'
    9. //工程版本号(这里去掉-SNAPSHOT)
    10. version = '0.0.1'
    11. //JDK版本
    12. sourceCompatibility = '1.8'

    13. //全局仓库
    14. repositories {
    15.         //maven仓库中心
    16.         mavenCentral()
    17. }

    18. dependencies {
    19.         //依赖正式架包
    20.         implementation 'org.springframework.boot:spring-boot-starter'
    21.         //依赖测试架包(正式构建时不会加入到依赖中)
    22.         testImplementation 'org.springframework.boot:spring-boot-starter-test'
    23. }

    24. test {
    25.         //Junit测试,Gradle 4.6及以上版本,加入该配置即自动支持
    26.         useJUnitPlatform()
    27. }
    复制代码

    1.3 构建demo

    完成Gradle的build.gradle、settings.gradle两个配置之后,接下来开始进行构建生成架包


    如果没配置Gradle配置的,可以先安装Gradle(下载地址https://gradle.org/releases/)并配置一下,配置为 File -> Settings -> Build, Execution, Deployment -> Build Tools - Gradle


    展开右侧Gradle视图栏,进行构建得到demo-0.0.1-plain.jar架包

    二、传统多模块(多配置)
    1. 现在实际的很多工程,一般不只是单个工程单模块,很多都是需要配置多模块的,比较传统的方式是直接添加各个子模块,每一个子模块对应一个build.gradle配置,比较简单,但是配置可能会比较冗余,网上很少有说明怎么整合多模块的配置到一个build.gradle里面的教程,下一章会进行介绍并给出定制化的方案
    复制代码
    2.1 添加子模块

    直接基于上面Springboot生成的demo主工程,添加三个子模块
    结构预览

    1. demo
    2.   ├─app_common
    3.   │  └─build.gradle
    4.   ├─app_one
    5.   │  └─build.gradle
    6.   ├─app_two
    7.   │  └─build.gradle
    8. ├─build.gradle
    9. ├─settings.gradle
    复制代码

    这种多模块创建方式比较简单,直接选中根目录demo,右键选择 New -> Module…

    选中Gradle -> Java -> Next

    命名要添加的子模块名称、填写GroupId/ArtifactId/Version三要素 -> Finish:

    同理,将app_one、app_two另外两个子模块也创建出来即可

    最终得到的工程结构如下图所示:

    每一个子模块下的build.gradle跟主模块的结构是一样的
    例如app_common/build.gradle配置如下:

    1. plugins {
    2.     id 'java'
    3. }

    4. group 'com.example'
    5. version '0.0.1'

    6. repositories {
    7.     mavenCentral()
    8. }

    9. dependencies {
    10.     testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.0'
    11.     testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'
    12. }

    13. test {
    14.     useJUnitPlatform()
    15. }
    复制代码

    主模块下的settings.gradle主要负载依赖其他子模块:

    1. rootProject.name = 'demo'
    2. include 'app_common'
    3. include 'app_one'
    4. include 'app_two'
    复制代码
    2.2 构建单模块

    同样的,完成多个子模块的创建后,测试一下Gradle构建单个模块是否正常
    展开右边的Gradle -> app_common -> Tasks -> build -> jar,双击执行即可完成单模块的构建

    最终得到app_common-0.0.1.jar单个构建包,一般生成在build的相关目录下:

    2.3 构建多模块

    也可以Gradle同时构建多个模块
    展开右边的Gradle -> build -> jar,双击执行即可完成多模块的同时构建

    三、定制多模块(单配置)
    3.1 定制化说明
    1. 可以看到前面传统的多模块虽然创建简单,不过每一个子模块都需要维护一个build.gradle配置,对于实际应用来说,可能会比较繁琐了,因此可以考虑将多个子模块的配置整合到一个配置里面,这里本文做了一个定制化的配置,除了原有的build.gradle、settings.gradle两个配置文件之外,还新建了另外一个dependencies.gradle以及自定义template目录下相关的脚本
    复制代码


    结构预览
    springboot-gradle-demo
      ├─template
        ├─gradle
              ├─v1
                    ├─build_java.gradle //bootjar、jar、war等构建方式定义
                    ├─buildscript.gradle //统一加载需要的插件
                    ├─functions.gradle //gralde定制化主函数配置
                    ├─junit.gradle //单元测试依赖的jdk版本、源码目录等
      ├─app_common
      ├─app_one
      ├─app_two
    ├─build.gradle //仓库定义、引用外部函数、插件以及依赖各个子模块定制化等
    ├─dependencies.gradle //根据名字可以看出主要用来进行依赖jar包用途
    ├─settings.gradle //主模块及子模块之间的include依赖

    3.2 定制化配置

    核心配置文件build.gradle、dependencies.gradle、settings.gradle及template配置内容及用途说明如下:
    (1)settings.gradle配置及说明:

    1. //Gradle主工程名
    2. rootProject.name = 'springboot-gradle-demo'

    3. //Gradle子模块名
    4. include 'app_common','app_one','app_two'
    复制代码

    (2)build.gradle配置及说明:

    1. //==================定制化1:仓库、编译、插件、公共依赖start==================
    2. buildscript {
    3.         //全局声明变量
    4.         ext {
    5.                 //maven公共仓库
    6.                 maven_public_repo_url="https://maven.aliyun.com/repository/public/"

    7.                 //gradle插件中心
    8.                 gradle_repo_url="https://plugins.gradle.org/m2/"

    9.                 //maven应用系统私有仓库
    10.                 //maven_private_dev_repo_url="https://maven.aliyun.com/repository/spring/"

    11.                 //DEV SNAPSHOTS依赖仓库
    12.                 //maven_snapshots_dev_repo_url="https://oss.sonatype.org/content/repositories/snapshots/"

    13.                 //插件目录(放在工程目录下,也可以单独存放到资源服务器,指定访问文件的具体url)
    14.                 template_dir="/template/gradle/v1"

    15.                 //编译目录(相对路径)
    16.                 output_dir="build"
    17.         }

    18.         //全局仓库: 自上而下寻找依赖
    19.         repositories {
    20.                 //maven本地仓库: 优先加载
    21.                 mavenLocal()

    22.                 //maven仓库中心
    23.                 mavenCentral()

    24.                 //jcenter仓库中心
    25.                 //jcenter()和mavenCentral()是两个独立的仓库,两者毫无关系,jcenter()有的mavenCentral()可能没有,反之亦然。
    26.                 jcenter()

    27.                 //google仓库中心
    28.                 //google()

    29.                 //maven远程仓库: 阿里云或公司私服仓库
    30.                 maven {
    31.                         url = maven_public_repo_url
    32.                         url = gradle_repo_url
    33.                         //url = maven_private_dev_repo_url
    34.                         //url = maven_snapshots_dev_repo_url
    35.                 }
    36.         }

    37.         //全局公共依赖
    38.         apply from: template_dir+'/buildscript.gradle',to: buildscript
    39. }
    40. //==================定制化1:仓库、编译、插件、公共依赖end==================

    41. //Java插件: 未配置时api、implementation无法加载
    42. plugins {
    43.         id 'java'
    44.         id 'java-library'
    45. }

    46. //==================定制化2:配置构建主入口、全局功能函数start==================
    47. //自定义全局工具定制化: 自动构建主入口+配置全局功能函数
    48. apply from: template_dir+'/functions.gradle'
    49. //==================定制化2:配置构建主入口、全局功能函数end==================


    50. //=======================定制化3:gradle子项目模块start=========================
    51. //common project
    52. project(':app_common'){
    53.         apply from: '..'+template_dir+'/build_java.gradle'
    54.         apply from: '..'+template_dir+'/junit.gradle'
    55. }

    56. //app_one project
    57. project(':app_one'){
    58.         apply from: '..'+template_dir+'/build_java.gradle'
    59.         apply from: '..'+template_dir+'/junit.gradle'
    60. }

    61. //app_two project
    62. project(':app_two'){
    63.         apply from: '..'+template_dir+'/build_java.gradle'
    64.         apply from: '..'+template_dir+'/junit.gradle'
    65. }
    66. //=======================定制化3:gradle子项目模块end=========================

    67. //=======================定制化4:子项目定义依赖start=========================
    68. apply from: 'dependencies.gradle'
    69. //=======================定制化4:子项目定义依赖end=========================
    70. //setSysSnapshotsRepo
    71. //待扩展...


    复制代码

    (3)dependencies.gradle配置及说明:

    1. //========================Gradle工程子模块依赖jar包及版本控制=========================
    2. //===========参数说明start=========
    3. //api: 依赖暴露,其他模块都可见
    4. //implementation: 表示依赖屏蔽,仅自己模块内可见
    5. //===========参数说明end===========



    6. //公共子模块依赖定义:app_common
    7. project(':app_common'){//app_common公共项目子模块: 作为jar工程供其他子模块引用,其他无须重复定义相关jar包
    8.         dependencies{
    9.                 //依赖仓库jar包
    10.                 api 'org.springframework.boot:spring-boot:2.4.3'
    11.                 api 'org.springframework.boot:spring-boot-starter-web:2.4.3'
    12.                 api 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.3'
    13.                 api 'mysql:mysql-connector-java:5.1.47'

    14.                 //依赖第三方jar包:指定工程资源lib目录下所有依赖包
    15.                 api fileTree(dir:'src/main/resources/lib',includes: ['*.jar'])

    16.                 //引入 mybatis-generator 插件
    17.                 //apply plugin: "com.arenagod.gradle.MybatisGenerator"

    18.                 //测试依赖:仅供测试用,仅当前模块生效,不会加载到打包版本中,PS: 根据实际需要定义
    19.                 testImplementation 'junit:junit:4.11'
    20.         }
    21. }

    22. //独立子模块依赖定义: app_one
    23. project(':app_one'){
    24.         dependencies{
    25.                 //模块依赖: 指定某个模块进行依赖
    26.                 implementation project(':app_common')

    27.                 //依赖第三方jar包:指定工程资源lib目录下所有依赖包
    28.             compile fileTree(dir:'src/main/resources/lib',includes: ['*.jar'])

    29.                 //依赖排除(包级别):exclude的内容将不会被该jar包引用,PS: 根据实际需要定义
    30.                 testImplementation (('org.springframework:spring-test:5.3.3')) {
    31.                         exclude group: 'org.springframework', module: 'mock'
    32.                         exclude group: 'org.springframework', module: 'mock'
    33.                         exclude group: 'org.springframework', module: 'mock'
    34.                         exclude group: 'org.springframework', module: 'mock'
    35.                 }

    36.                 //依赖排除(模块级别):exclude的内容将不会被该jar包引用,PS: 根据实际需要定义
    37.                 implementation (project(':app_common')) {
    38.                         exclude group: 'org.springframework', module: 'mock'
    39.                         exclude group: 'org.springframework', module: 'mock'
    40.                         exclude group: 'org.springframework', module: 'mock'
    41.                         exclude group: 'org.springframework', module: 'mock'
    42.                 }

    43.                 //测试依赖:仅供测试用,仅当前模块生效,不会加载到打包版本中,PS: 根据实际需要定义
    44.                 testImplementation 'junit:junit:4.11'
    45.                 testImplementation 'org.mybatis.generator:mybatis-generator-core:1.3.7'
    46.         }

    47.         //依赖排除(全局级别):exclude的内容将不会被该jar包引用,PS: 当要排除的依赖范围很广时,可采用该方式
    48.         configurations.all {
    49.                 exclude group: 'org.springframework', module: 'spring-core'
    50.         }
    51. }

    52. //独立子模块依赖定义: app_two
    53. project(':app_two'){
    54.         dependencies{
    55.                 //模块依赖: 指定某个模块进行依赖
    56.                 implementation project(':app_common')

    57.                 //依赖第三方jar包:指定工程资源lib目录下所有依赖包
    58.                 compile fileTree(dir:'src/main/resources/lib',includes: ['*.jar'])

    59.                 //依赖排除(包级别):exclude的内容将不会被该jar包引用,PS: 根据实际需要定义
    60.                 testImplementation (('org.springframework:spring-test:5.3.3')) {
    61.                         exclude group: 'org.springframework', module: 'mock'
    62.                         exclude group: 'org.springframework', module: 'mock'
    63.                         exclude group: 'org.springframework', module: 'mock'
    64.                         exclude group: 'org.springframework', module: 'mock'
    65.                 }

    66.                 //依赖排除(模块级别):exclude的内容将不会被该jar包引用,PS: 根据实际需要定义
    67.                 implementation (project(':app_common')) {
    68.                         exclude group: 'org.springframework', module: 'mock'
    69.                         exclude group: 'org.springframework', module: 'mock'
    70.                         exclude group: 'org.springframework', module: 'mock'
    71.                         exclude group: 'org.springframework', module: 'mock'
    72.                 }

    73.                 //测试依赖:仅供测试用,仅当前模块生效,不会加载到打包版本中,PS: 根据实际需要定义
    74.                 testImplementation 'junit:junit:4.11'
    75.                 testImplementation 'org.mybatis.generator:mybatis-generator-core:1.3.7'
    76.         }

    77. }


    复制代码

    (4)template下的相关组件及函数
    除了template/gradle/v1/functions.gradle这段内容中的包名com.justin需要改成自己的之外,其他可以可以不需要动

    1.   //deploy package dir of the project (sub-dir of output-dir)
    2.                 setSysPrivateRepo = { sys_id ->
    3.                         allprojects{
    4.                                 repositories{
    5.                                         maven {
    6.                                                 url maven_private_dev_repo_url
    7.                                                 content { includeGroupByRegx "com\\.justin\\."+sys_id+".*" }
    8.                                         }
    9.                                 }
    10.                         }
    11.                 }
    复制代码
    3.3 构建多模块(定制化)

    同样整合了多个子模块的配置进行几种管理之后,跟前面一样,可以通过Gradle视图栏,对多个模块或者单个模块进行构建,生成得到jar、bootjar、war等格式的架包

    如果大家有需要将多个模块的配置整合到一个配置里面进行管理的需求,可以根据本文提供的spring-boot-demo示例工程进行修改,来实现自己工程的定制化多模块配置的统一管理~

    最后,附上spring-boot-demo工程的GitHub源码下载地址:https://github.com/JustinJava/springboot-gradle-demo









    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

    x
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-17 00:37 , Processed in 0.066690 second(s), 24 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表