gradle中api、implementation和compile的區別
api或compile關鍵字引用的包對於其他module來說是可見的,而implementation關鍵字引用的包對於其他module來說是不可見的,也就是說只能用於本項目中。
配置子項目
-
需要setting.gradle文件,寫法爲:
rootProject.name = 'root-project' include 'project1' include 'project2'
-
如果想引用跟’root-project’同級的項目作爲其子模塊,表達方式爲:
rootProject.name = 'root-project' include 'sub-project1' include 'sub-project2' include 'sub-project3' project(':sub-project3').projectDir = file("$rootDir/../sub-project3")
$rootDir指的是root-project項目所在的目錄,至於…我覺得是說從rootDir開始找,一層層找,一直到找到sub-project3爲止
共享配置
有3種方式可以共享配置,各有各的使用場景:
-
allprojects
allprojects是根Project的一個屬性,在Gradle中,我們可以通過根Project的allprojects()方法將配置一次性地應用於所有的Project,當然也包括定義Task。比如:allprojects { apply plugin: 'idea' task allTask << { println project.name } }
以上Gradle腳本將閉包中的代碼應用在所有的Project中,包括root-project本身
第二種寫法:configure(allprojects){ project -> apply plugin: 'idea' ... def projectName = project.name //爲後端模塊增加spring boot起步依賴 def projectName = project.name if(projectName.substring(projectName.length()-3,projectName.length()) != 'web'){ dependencies{ implementation 'org.springframework.boot:spring-boot-starter-actuator' ... } xxxxx ... } }
-
subprojects
subprojects和allprojects一樣,也是父Project的一個屬性,在父項目的build.gradle腳本里,但subprojects()方法用於配置所有的子Project(不包含根Project)。subprojects { apply plugin: 'java' repositories { mavenCentral() } ext { guavaVersion = ’14.0.1’ junitVersion = ‘4.10’ } dependencies { compile( “com.google.guava:guava:${guavaVersion}” ) testCompile( “junit:junit:${junitVersion}” ) } task subTask << { println project.name } }
此外,這裏還在ext裏配置依賴包的版本,方便以後升級依賴的版本。
-
configure
在項目中,並不是所有的子項目都會具有相同的配置,但是會有部分子項目具有相同的配置。Gradle提供的 configure 屬性塊可以讓我們根據模塊名稱引入特定插件。:configure(allprojects.findAll { it.name.startsWith('sub') }) { subTask << { println 'this is a sub project' } }
在上面的代碼中,我們先找到所有Project中名字以“sub”開頭的Project,然後再對這些Project進行配置,在配置中,我們向這些Project的subTask中加入了一條額外的打印語句。
:sub-project1:subTask sub-project1 this is a sub project :sub-project2:subTask sub-project2 this is a sub project
或者我們可以通過ext定義一個變量再傳入到configure中:
ext.subProjects = allprojects.findAll { it.name.startsWith('sub') } configure(subProjects) { apply plugin: 'war' }
獨享配置
我們所有的Task定義工作都是在root-project中進行的,而sub-project1和sub-project2中的build.gradle文件依然什麼都沒有。事實上,我們可以將所有對子Project的配置均放在根Project中進行。在上面的例子中,我們通過allprojects()和subprojects()將所有的子Project都包含在了配置之內,其實我們還可以對單個Project進行單獨配置。比如,在root-project的build.gradle中加入:
project(':sub-project1') {
task forProject1 << {
println 'for project 1'
}
}
以上腳本向sub-project1中加入了名爲forProject1的Task,在執行“gradle forProject1”時,終端輸出如下:
:sub-project1:forProject1
for project 1
注意這裏子項目名字前面有一個冒號(:)。 通過這種方式,指定對應的子項目,並對其進行配置。
(2)我們還可以在每個子項目的目錄裏建立自己的構建腳本。在上例中,可以在子項目core目錄下爲其建立一個build.gradle文件,並在該構建腳本中配置core子項目所需的所有配置。例如,在該build.gradle文件中添加如下配置:
ext{
hibernateVersion = ‘4.2.1.Final’
}
dependencies {
compile “org.hibernate:hibernate-core:${hibernateVersion}”
}
依賴管理
通過io.spring.dependency-management插件實現類Maven的依賴管理方式:
plugins {
id "io.spring.dependency-management" version "1.0.8.RELEASE"
}
gradle有兩種方案可以解決同一項目,不同版本依賴的問題。
- dsl(待補充)
- 導入一個或者多個已經存在的Maven bom文件
dsl暫時還不清楚,後續補充~~~
導入Maven Bom的方式:
dependencyManagement {
imports {
mavenBom 'io.spring.platform:platform-bom:1.0.1.RELEASE'
}
}
dependencies {
compile 'org.springframework.integration:spring-integration-core'
}
這個配置會將Spring框架的Bom的依賴應用到當前的項目,bom會幫忙填充版本,
你也可以自己指定版本;它會根據兩者取一個合理不衝突的值
此外如果是springboot項目,還有另一個插件:
dependencyManagement {
imports {
mavenBom org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES
}
}
buildscript中的repositories和allprojects的repositories的作用和區別
-
buildScript塊裏面的代碼是gradle執行腳本需要的依賴。一些插件需要這個額外的依賴才能起作用,比如這個插件:
////修復了Windows Gradle長類路徑問題。修復了錯誤消息爲“ CreateProcess error = 206,文件名或擴展名太長”的JavaExec / Test任務 apply plugin: "ua.eshepelyuk.ManifestClasspath"
要想讓他生效,就必須在buildscript裏引入依賴
buildscript { repositories { maven{ url "http://maven.aliyun.com/repository/gradle-plugin"} } dependencies { classpath "gradle.plugin.ua.eshepelyuk:ManifestClasspath:1.0.0" } }
另外引用一下:
gradle腳本自身需要使用的資源。可以聲明的資源包括依賴項、第三方插件、maven倉庫地址等。而在build.gradle文件中直接聲明的依賴項、倉庫地址等信息是項目自身需要的資源。
作者:zheting
鏈接:https://www.jianshu.com/p/d3008623cced
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。 -
allprojects裏是項目本身需要的依賴,比如“mysql:mysql-connector-java”,“org.projectlombok:lombok”等等
sourceSets用法
對於他的解釋,官網是這麼說的:
大意是說SourceSet包括源文件及位置、它們的依賴、編譯輸出的位置這三個概念,SourceSet可以把不同文件目錄裏的文件按照邏輯關係組織起來。
-
它可以改變固定的Java的標準項目目錄佈局
sourceSets { main { java { srcDirs = ['src/java'] } resources { srcDirs = ['src/resources'] } } }
這樣,gradle就只在src/java下搜源代碼,而不是在src/main/java(固定的Java的標準項目目錄佈局)下。
-
.如果我想在打包的時候, 不包含某些文件, 可以如下進行設置
sourceSets { main { java { exclude '/test/**' // 不想包含文件的路徑 } resources { exclude '/resource/**' // 不想包含的資源文件路徑 } ..... } }
或者我想將java目錄中的xml文件等文件作爲資源文件使用
subprojects { sourceSets { main { resources { srcDirs = ["src/main/java","src/main/resources"] excludes = ["**/*.java"] } } } }
-
指定manufact文件
sourceSets{ mainClassName='xxxx.SpringbootApplication' }