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')
}