gradle知識點散記

gradle中api、implementation和compile的區別

api或compile關鍵字引用的包對於其他module來說是可見的,而implementation關鍵字引用的包對於其他module來說是不可見的,也就是說只能用於本項目中。

配置子項目

  1. 需要setting.gradle文件,寫法爲:

    rootProject.name = 'root-project'
    include 'project1'
    include 'project2'
    
  2. 如果想引用跟’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種方式可以共享配置,各有各的使用場景:

  1. 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
        ...
    	}
    }
    
  2. 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裏配置依賴包的版本,方便以後升級依賴的版本。

  3. 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的作用和區別

  1. 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
    來源:簡書
    著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

  2. allprojects裏是項目本身需要的依賴,比如“mysql:mysql-connector-java”,“org.projectlombok:lombok”等等

sourceSets用法

對於他的解釋,官網是這麼說的:

大意是說SourceSet包括源文件及位置、它們的依賴、編譯輸出的位置這三個概念,SourceSet可以把不同文件目錄裏的文件按照邏輯關係組織起來。

  1. 它可以改變固定的Java的標準項目目錄佈局

    sourceSets {
        main {
            java {
                srcDirs = ['src/java']
            }
            resources {
                srcDirs = ['src/resources']
            }
        }
    }
    
    

    這樣,gradle就只在src/java下搜源代碼,而不是在src/main/java(固定的Java的標準項目目錄佈局)下。

  2. .如果我想在打包的時候, 不包含某些文件, 可以如下進行設置

        sourceSets {
            main {
                java {
                    exclude '/test/**'  // 不想包含文件的路徑
                }
                resources {
                    exclude '/resource/**' // 不想包含的資源文件路徑
                }
                .....
            }
        }
    
    

    或者我想將java目錄中的xml文件等文件作爲資源文件使用

    subprojects {
        sourceSets {
            main {
                resources {
                    srcDirs = ["src/main/java","src/main/resources"]
                    excludes = ["**/*.java"]
                }
            }
        }
    }
    
    
  3. 指定manufact文件

    sourceSets{
        mainClassName='xxxx.SpringbootApplication'
    }
    
    

參考文獻

Gradle多模塊項目

Gradle中的SourceSet理解

Android gradle SourceSets介紹與使用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章