Gradle中的buildScript代碼塊

在編寫Gradle腳本的時候,在build.gradle文件中經常看到這樣的代碼:

build.gradle
1
2
3
4
5
6
7
8
9
buildScript {
     repositories {
         mavenCentral()
}
}

repositories {
     mavenCentral()
}

這樣子很容易讓人奇怪,為什么repositories要聲明兩次哪?buildscript代碼塊中的聲明與下半部分聲明有什么不同?

其實答案非常簡單。buildscript中的聲明是gradle腳本自身需要使用的資源。可以聲明的資源包括依賴項、第三方插件、maven倉庫地址等。而在build.gradle文件中直接聲明的依賴項、倉庫地址等信息是項目自身需要的資源。

gradle是由groovy語言編寫的,支持groovy語法,可以靈活的使用已有的各種ant插件、基于jvm的類庫,這也是它比maven、ant等構建腳本強大的原因。雖然gradle支持開箱即用,但是如果你想在腳本中使用一些第三方的插件、類庫等,就需要自己手動添加對這些插件、類庫的引用。而這些插件、類庫又不是直接服務于項目的,而是支持其它build腳本的運行。所以你應當將這部分的引用放置在buildscript代碼塊中。gradle在執行腳本時,會優先執行buildscript代碼塊中的內容,然后才會執行剩余的build腳本。

舉個例子,假設我們要編寫一個task,用于解析csv文件并輸出其內容。雖然我們可以使用gradle編寫解析csv文件的代碼,但其實apache有個庫已經實現了一個解析csv文件的庫供我們直接使用。我們如果想要使用這個庫,需要在gradle.build文件中加入對該庫的引用。

build.gradle
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
buildscript {
    repositories {
        mavenLocal()
        mavenCentral()
    }

    dependencies {
        classpath 'org.apache.commons:commons-csv:1.0'
    }
}

import org.apache.commons.csv.*

task printCSV() {
    doLast {
        def records = CSVFormat.EXCEL.parse(new FileReader('config/sample.csv'))
        for (item in records) {
            print item.get(0) + ' '
            println item.get(1)
        }

    }
}

buildscript代碼塊中的repositories和dependencies的使用方式與直接在build.gradle文件中的使用方式幾乎完全一樣。唯一不同之處是在buildscript代碼塊中你可以對dependencies使用classpath聲明。該classpath聲明說明了在執行其余的build腳本時,class loader可以使用這些你提供的依賴項。這也正是我們使用buildscript代碼塊的目的。

而如果你的項目中需要使用該類庫的話,就需要定義在buildscript代碼塊之外的dependencies代碼塊中。所以有可能會看到在build.gradle中出現以下代碼:

build.gradle
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
repositories {
    mavenLocal()
    mavenCentral()
}

dependencies {
    compile 'org.springframework.ws:spring-ws-core:2.2.0.RELEASE',
            'org.apache.commons:commons-csv:1.0'
}


buildscript {
    repositories {
        mavenLocal()
        mavenCentral()
    }

    dependencies {
        classpath 'org.apache.commons:commons-csv:1.0'
    }
}

import org.apache.commons.csv.*

task printCSV() {
    doLast {
        def records = CSVFormat.EXCEL.parse(new FileReader('config/sample.csv'))
        for (item in records) {
            print item.get(0) + ' '
            println item.get(1)
        }

    }
}

官方具體解釋請參見:http://chimera.labs.oreilly.com/books/1234000001741/ch04.html#_buildscript_dependencies

轉載于:https://www.cnblogs.com/huang0925/p/3940528.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/273611.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/273611.shtml
英文地址,請注明出處:http://en.pswp.cn/news/273611.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Redis List 類型操作及常用命令

七個原則 Redis 是一個操作數據結構的語言工具,它提供基于 TCP 的協議以操作豐富的數據結構。在 Redis 中,數據結構這個詞的意義不僅表示在某種數據結構上的操作,更包括了結構本身及這些操作的時間空間復雜度。Redis 定位于一個內存數據庫&am…

Hibernate查詢之Criteria查詢

轉自:http://www.cnblogs.com/Laupaul/archive/2012/02/15/2353194.html Criteria是一種比hql更面向對象的查詢方式。Criteria 可使用 Criterion 和 Projection 設置查詢條件。可以設置 FetchMode( 聯合查詢抓取的模式 ) ,設置排序方式,Crite…

IntelliJ Idea 常用插件

必備插件 Lombok 使用此插件可以使得我們的代碼簡潔,不用去寫很多的set/get方法。使用之前需要引入 lombok 插件依賴。 JsonFormat 基于GsonFormat。快速將JSON字符串轉換為實體類。它支持Jackson注釋。 MyBatis Log Plugin 將 SQL 直接打印在控制臺,不用…

jQuery 學習筆記(jQuery: The Return Flight)

第一課. ajax:$.ajax(url[, settings]) 練習代碼: $(document).ready(function() {$("#tour").on("click", "button", function() {$.ajax(/photos.html, {success: function(response) {$(.photos).html(response).fadeI…

Redis Hash 類型操作及常用命令

七個原則 Redis 是一個操作數據結構的語言工具,它提供基于 TCP 的協議以操作豐富的數據結構。在 Redis 中,數據結構這個詞的意義不僅表示在某種數據結構上的操作,更包括了結構本身及這些操作的時間空間復雜度。Redis 定位于一個內存數據庫&am…

Redis set 類型操作及常用命令

七個原則 Redis 是一個操作數據結構的語言工具,它提供基于 TCP 的協議以操作豐富的數據結構。在 Redis 中,數據結構這個詞的意義不僅表示在某種數據結構上的操作,更包括了結構本身及這些操作的時間空間復雜度。Redis 定位于一個內存數據庫&am…

緩存初解(五)---SpringMVC基于注解的緩存配置--web應用實例

之前為大家介紹了如何使用spring注解來進行緩存配置 (EHCache 和 OSCache)的簡單的例子,詳見 Spring基于注解的緩存配置--EHCache AND OSCache 現在介紹一下如何在基于注解springMVC的web應用中使用注解緩存,其實很簡單&#xff0…

Redis String 類型操作及常用命令

七個原則 Redis 是一個操作數據結構的語言工具,它提供基于 TCP 的協議以操作豐富的數據結構。在 Redis 中,數據結構這個詞的意義不僅表示在某種數據結構上的操作,更包括了結構本身及這些操作的時間空間復雜度。Redis 定位于一個內存數據庫&am…

于我,過去,現在和未來 —— 西格里夫·薩松

In me, past, present, future meet            于我,過去、現在和未來To hold long chiding conference              商討聚會 各執一詞 紛擾不息My lusts usurp the present tense             林林總總的 欲望,…

Java assert關鍵字

Java assert關鍵字 Assert 簡介 Java2在1.4中新增了一個關鍵字:assert。在程序開發過程中使用它創建一個斷言(assertion)。語法格式有兩種: assert condition; 這里condition是一個必須為真(true)的表達式。如果表達式的結果為true,那么斷言為…

linux 二級域名設置

首先,你的擁有一個有泛域名解析的頂級域名,例如: domain.com  其次,在 httpd.conf 中打開 mod_rewrite  之后,在 httpd.conf 的最后,添加以下內容:  RewriteEngine on  RewriteMap lowe…

Spring Boot @Conditional 注解

Spring Boot Conditional注解 Conditional是Spring4新提供的注解,它的作用是按照一定的條件進行判斷,滿足條件的才給容器注冊Bean。 Conditional注解定義 Target({ElementType.TYPE, ElementType.METHOD}) Retention(RetentionPolicy.RUNTIME) Documente…

計算幾何 半平面交

LA 4992 && hdu 3761 Jungle Outpost 杭電的有點坑啊。。一直爆內存,后來發現大白的半平面交模板那里 point *p new point[n]; line *q new line[n]這里出了問題,應該是在函數里面申請不了比較大的數組,所以爆內存。。我在全局定義…

Maven 強制導入jar包

場景 有時候因為各種原因(依賴有了,jar包有了),項目中就是沒有這個jar包。 在需要強導的項目中創建lib文件夾,將需要強導的jar包訪問lib中。添加依賴${pom.basedir}:獲取當前所在的項目目錄 ${pom.basedir&…

0910

我累得時候希望你能在我身邊,在你的懷里好好的睡一覺。轉載于:https://www.cnblogs.com/zhanzhao/p/3964175.html

《Java 高并發》03 線程的生命周期

相關概念 進程是指一個內存中運行的應用程序,每個進程都有自己獨立的一塊內存空間,一個進程中可以啟動多個線程。 一個進程是一個獨立的運行環境,它可以被看作一個程序或者一個應用。而線程是在進程中執行的一個任務。Java運行環境是一個包含…

OpenLayers3 online build

openlayers3使用了一個比較復雜的build工具,從github上下載下來的代碼中并沒有build之后的版本,要配置build環境又比較繁瑣,好在官方的example中提供了在線的版本,下面就是link: http://openlayers.org/en/v3.0.0/buil…

Mysql 必知必會(一)

文章案例所需的SQL文件,點擊下載 使用MySQL 進入mysql安裝目錄下的bin目錄: 連接Mysql:mysql -uroot -p123456;顯示Mysql下的所有數據庫:show databases;切換數據庫:use local;顯示數據庫下所有表名:show t…

design.js

//模塊式開發 var myNamespace (function () { var myPrivateVar 0;var myPrivateMethod function (foo) {console.log(foo); };return {myPublicVar : "foo",myPublicFunction : function (bar) {myPrivateVar;myPrivateMethod(bar);} }; })(); //原型模式 var…

Spring boot 整合dynamic實現多數據源

項目git地址:Jacob-dynamic 準備工作 # 創建數據庫db1 CREATE DATABASE db1CHARACTER SET utf8 COLLATE utf8_bin # 創建user表 CREATE TABLE user (id int(11) DEFAULT NULL,name varchar(255) DEFAULT NULL ) ENGINEInnoDB DEFAULT CHARSETutf8 # 添加數據 INSERT…