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