Gradle project介绍

本文详细介绍了Gradle项目管理的基本概念,包括项目结构、项目API使用、属性管理及文件与依赖操作。通过实例展示了如何在多模块项目中有效管理和配置各个模块。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Gradle project介绍

1.project概述

1.1.什么是project

多模块项目中,每个模块就是一个project。每个模块下都有一个build.gradle文件, Gradle判断是否是project就看项目中有多少个build.gradle文件,每个文件代表一个project。

1.2.Gradle如何管理poject

Gradle用树结构来管理project,每个project就是一个节点,项目的根模块就是根节点project,且只有一个根节点。项目中子模块就是子节点project。

1.3.查看项目中project
  • 查看项目有哪些project以及project父子关系,在IDEA的Terminal控制台输入下面的命令
gradle projects
  • 控制台输出项目中根节点project是gradleInfo,其他的都是p1~p3都是子节点project
------------------------------------------------------------
Root project
------------------------------------------------------------

Root project 'gradleInfo'
+--- Project ':p1'
+--- Project ':p2'
\--- Project ':p3'

2. Project API

2.1. Project API 组成

在这里插入图片描述

2.2. project api

1.操作project api 代码都是在项目的build.gradle文件中编写,运行代码都是在IDEA的Terminal控制台输入gradle clean
2.操作project api 代码都是在Gradle的配置阶段运行。

2.2.1.获取所有project
// 获取所有的project
println this.getAllprojects()

//对getAllprojects()输出做个包装
def getProjects() {
    this.getAllprojects().eachWithIndex { Project project, int index ->
        if (index == 0) {
            println "ROOT Project ':${project.name}'"
        } else {
            println "+--- Project ':${project.name}"
        }
    }
}
//调用getProjects
this.getProjects()
2.2.2.获取父project 和 子project
//获取父Project
def name = this.getParent().name
println "this Parent name ${name}"
//获取根节点project
def rootname = this.getRootProject().name
println "this root project ${rootname}"
//获取所有子project
def subname = this.getSubprojects()
println "this sub project ${subname}"
2.2.3.父project中配置子project属性
  • 在父project的build.gradle文件中获取指定的子project,然后配置该子project中的内容。
//父projet中配置子project中的内容
//获取p1 project
project('p1'){ Project project ->
    //设置p1 project中的内容
    //设置打包使用的插件
    apply plugin: 'java'
    //设置group坐标
    group 'com.bruce.gradle'
    //设置版本号
    version '1.0.1-SNAPSHOW'
}
2.2.4.配置所有project共有的属性

在多模块项目中,每个模块的buil.gradle文件配置的内容会有重复部分,例如项目的坐标、版本号、引用的依赖等。如果这些内容在每个模块中都写一遍,修改的时候又要每个模块都去操作一遍,既冗余又繁琐。所以我们将每个模块共同的配置内容抽取出来放到项目根节点的allprojects闭包中,allpojects生效范围就是项目的所有project。

  • 在项目根节点的build.gradle中添加allprojects,将project共同的内容放在这里。
//配置该节点以及所有子节点project内容
allprojects {
    group 'com.bruce.gradle'
    version '1.0.1-SNAPSHOW'
    buildDir 'target'
    apply plugin: 'java'
    apply plugin: 'idea'
    apply plugin: 'maven'
}
2.2.5.配置所有子模块project共有属性

多模块项目中将多个子模块共有的内容,且父模块不需要配置的内容抽取出来放到subprojects中。

//配置所有子模块project公共内容,不包括当前父模块。
subprojects {
    sourceCompatibility = 1.8
    targetCompatibility = 1.8
    repositories {
        mavenLocal()
        maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
        mavenCentral()
    }
    dependencies {
        compile('org.apache.jmeter:ApacheJMeter_core:5.1.1')
        compile('org.apache.jmeter:ApacheJMeter_components:5.1.1')
        compile('org.apache.jmeter:ApacheJMeter_java:5.1.1')
    }
}
2.3. project 属性api

project 属性分为两个部分:Project接口中定义的属性扩展属性

2.3.1.Project接口中定义的属性

在build.gradle文件中点击Project 跳转到该接口页面,可以看到如下定义的属性。

  • DEFAULT_BUILD_FILE:属性值就是为什么gradle判断项目中有多少project的依据是来源于buil.gradle原因。
  • PATH_SEPARATOR :读取文件路径分割符号为冒号
  • DEFAULT_BUILD_DIR_NAME:默认项目构建输出目录
  • GRADLE_PROPERTIES:配置project属性文件
package org.gradle.api;

public interface Project extends java.lang.Comparable<org.gradle.api.Project>, org.gradle.api.plugins.ExtensionAware, org.gradle.api.plugins.PluginAware {
    java.lang.String DEFAULT_BUILD_FILE = "build.gradle";
    java.lang.String PATH_SEPARATOR = ":";
    java.lang.String DEFAULT_BUILD_DIR_NAME = "build";
    java.lang.String GRADLE_PROPERTIES = "gradle.properties";
    java.lang.String SYSTEM_PROP_PREFIX = "systemProp";
    java.lang.String DEFAULT_VERSION = "unspecified";
    java.lang.String DEFAULT_STATUS = "release";
2.3.2.Project扩展属性方式一

ext闭包扩展属性方式

  • 定义扩展属性方法: 定义ext闭包,在闭包中扩展project属性。
  • 优势:在根工程中build.gradle文件中定义ext扩展属性,那么项目中所有的子模块都将拥有该扩展属性。无需在每个子模块中再次定义。在子模块中直接调用定义好的属性即可。在修改的时候只需要修改一处即可在所有子模块中生效。
  • 缺点:虽然我们定义的时候只是在父节点的build.gradle文件中定义一次扩展属性,但是在当项目应用在不同的环境中那么还是要修改一些内容。
//扩展Project属性
ext {
    source = 1.8
    target = 1.8
    ApacheJMeter_core = 'org.apache.jmeter:ApacheJMeter_core:5.1.1'
    ApacheJMeter_components = 'org.apache.jmeter:ApacheJMeter_components:5.1.1'
    ApacheJMeter_java = 'org.apache.jmeter:ApacheJMeter_java:5.1.1'
    maven_aliyun = 'http://maven.aliyun.com/nexus/content/groups/public/'

}

//配置所有子模块project公共内容,不包括当前父模块。
//引用 ext扩展的Project属性
subprojects {
    sourceCompatibility = this.source
    targetCompatibility = this.target
    repositories {
        mavenLocal()
        maven { url this.maven_aliyun }
        mavenCentral()
    }
    dependencies {
        compile(this.ApacheJMeter_core)
        compile(this.ApacheJMeter_components)
        compile(this.ApacheJMeter_java)
    }
}

配置文件扩展属性

  • 1.在根工程中创建一个后缀为gradle文件定义扩展属性

  • 2.在根工程的build.gradle引入上面创建的文件

  • 3.在子模块中使用扩展的属性

  • 在根工程中创建common.gradle文件,定义属性。

//ext声明属性扩展
ext {

    //定义一个集合对配置文件内容分类存放
    compiles = [
            'source' : 1.8,
            'target' : 1.8
    ]
    repositories = [
            mavenaliyun : 'http://maven.aliyun.com/nexus/content/groups/public/'

    ]

    dependence = [
            'Junit' : 'junit:junit:4.12',
            'Mysql' : 'mysql:mysql-connector-java:8.0.19'
    ]
    
}
  • 在根工程的build.gradle中引入配置文件
apply from : this.file('common.gradle')
  • 在子模块中使用配置文件的属性
    • rootProject是根工程的project
    • ext.compiles.source :配置文件中的内容
subprojects {
    sourceCompatibility = rootProject.ext.compiles.source
    targetCompatibility = rootProject.ext.compiles.target
    repositories {
        mavenLocal()
        maven { url rootProject.ext.repositories.mavenaliyun }
        mavenCentral()
    }

    dependencies {
        compile(rootProject.ext.dependence.Junit)
        compile(rootProject.ext.dependence.Mysql)
    }
}
2.3.3.Project扩展属性方式二

在项目中gradle.properties文件中直接定义属性,属性定义只能是Kev=Val键值对形式。没有上面自定义文件定义方式灵活。

  • 在gradle.properties文件中定义属性和值
mysql = mysql:mysql-connector-java:8.0.19
  • 在子模块中直接使用属性名称
dependencies {
    compile(mysql)
}
2.4.project 文件API
2.4.1 获取文件路径api
//获取根工程下文件
println "获取根工程下文件:"+getRootDir().absolutePath
//获取当前工程下build文件
println "获取当前工程下build文件:"+getBuildDir().absolutePath
//获取当前工程文件
println "获取当前工程文件:"+getProjectDir().absolutePath
2.4.2.文件操作
1.读取文件内容
println getContext('common.gradle')
//获取文件内容
def getContext(String path) {
    try {
            //file()查找当前工程下的文件
        def file = file(path)
        return file.text
    } catch (GradleException e) {
        println '没有找到这个文件'
    }
    return null
}
2.拷贝文件
copy {
    //文件来源 一般拷贝生成的apk
    from file('common.gradle')
    //文件目标位置 将apk包拷贝到服务器存储路径下
    into getRootProject().getBuildDir().path+'/apk'
}
3.拷贝文件夹
//文件树遍历
fileTree('gradleInfo/target'){FileTree fileTree ->
    fileTree.visit {FileTreeElement element ->
        println 'the file name :'+element.file.name
        copy {
            from element.file.name
            into getRootProject().getBuildDir().path+'/test'
        }
    }

}
2.5.project 依赖API

dependencies 依赖由两部分,在buildscript中定义的 dependencies引入的是工程需要的插件。在build.gradle文件中dependencies引入的是应用程序需要的jar包。

  • buildscript 依赖
buildscript { ScriptHandler scriptHandler->
    //配置工程仓库地址
    scriptHandler.repositories { RepositoryHandler repositoriesHandle->
        //添加jcenter依赖库
        repositoriesHandle.jcenter()
        //添加maven中心依赖库
        repositoriesHandle.mavenCentral()
        //添加本地maven依赖库
        repositoriesHandle.mavenLocal()
        //添加私有maven
        repositoriesHandle.maven {
            name 'mylocal'
            url 'http://localhost:8088:/next/repostory'
            credentials{
                username = 'admin'
                password = '123456'
            }
        }
    }
    //配置工程的“插件”依赖地址
    scriptHandler.dependencies {
        // 为工程引入tinker 插件
        classpath 'com.tencent.tinker-patch-gradle-plugin:1.7.7'
    }

}
  • build.gradle 中的依赖
//为应用程序添加第三方依赖
dependencies {
    //引入依赖
    compile(rootProject.ext.dependence.Junit)
    //排除冲突依赖
    exclude module:'log4j-core'
    //占位编译,在编译的时候会使用这个依赖,但是在打包输出时是不会输出到jar中。
    provided('mysql:mysql-connector-java:8.0.19')
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值