利用Gradle如何構(gòu)建scala多模塊工程的步驟詳解
前言
Scala是一門強(qiáng)大的語言,受到很多人的喜愛,我也曾經(jīng)嘗試學(xué)習(xí)過。不過Scala官網(wǎng)專用的構(gòu)建工具SBT就不那么好用了。我曾經(jīng)想將SBT的軟件包保存路徑設(shè)置到D盤,還想設(shè)置網(wǎng)絡(luò)代理,不過最后都沒搞明白怎么回事。相信也有很多同學(xué)想學(xué)習(xí)Scala,但是卻被SBT擋在了門外。偶然之下我發(fā)現(xiàn)現(xiàn)在Gradle增加了scala插件,可以完美支持Scala項(xiàng)目。
前段時(shí)間終于無法忍受sbt慢如龜速的編譯打包速度了。稍稍調(diào)研了一下,就果斷切換到了gradle。由于調(diào)研得比較匆忙,在使用過程中遇到了各種問題。好在最后都能解決了。
我這里使用scala主要是用來編寫spark job。由于我自己的一些需要,這些job中有幾個(gè)是多模塊的。在這里簡(jiǎn)單解釋一下如何使用gradle構(gòu)建scala多模塊項(xiàng)目。
這里用我最近開發(fā)的項(xiàng)目來做說明。項(xiàng)目名稱是consumer-portrait-job,有兩個(gè)子模塊:common和compute。
步驟如下
首先在項(xiàng)目根目錄下創(chuàng)建一個(gè)settings.gradle文件,這個(gè)文件主要用來描述項(xiàng)目名稱及子模塊信息:
rootProject.name = 'consumer-portrait-job' include 'common', 'compute'
然后再創(chuàng)建一個(gè)build.gradle文件。這個(gè)文件描述了主項(xiàng)目及子項(xiàng)目的一些通用配置。配置如下:
allprojects { apply plugin: 'idea' group = 'com.zhyea.portrait' version = '0.1-SNAPSHOT' } subprojects { apply plugin: 'scala' sourceCompatibility = 1.7 targetCompatibility = 1.7 ext { scalaVersion = '2.10.5' sparkVersion = '1.4.1' } repositories { mavenLocal() maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' } mavenCentral() } dependencies { testCompile group: 'junit', name: 'junit', version: '4.12' compileOnly group: 'org.apache.spark', name: 'spark-core_2.10', version: sparkVersion compileOnly group: 'org.scala-lang', name: 'scala-compiler', version: scalaVersion } task mkdirs() { sourceSets*.scala.srcDirs*.each { it.mkdirs() } sourceSets*.resources.srcDirs*.each { it.mkdirs() } } }
在這個(gè)配置文件中包含兩個(gè)大的模塊:allprojects和subprojects。
allprojects中的配置是所有項(xiàng)目共享的(包含根項(xiàng)目)。在這里,我定義了項(xiàng)目的groupId和version等信息,并應(yīng)用了gradle的idea插件。
subprojects的配置是所有子項(xiàng)目通用的。
在subprojects中的第一行聲明了使用gradle的scala插件。
接下來的配置項(xiàng)“sourceCompatibility”聲明了編譯時(shí)使用的jdk版本;“targetCompatibility”確保了編譯生成的class與指定版本的jdk兼容。
在ext中聲明了子項(xiàng)目中可以使用的一些變量。我這里是聲明了scala和spark的版本。
repositories項(xiàng)配置了當(dāng)前項(xiàng)目可以使用的倉庫。這里使用的第一個(gè)倉庫是本機(jī)的maven庫,第二庫是ali提供的repository服務(wù),第三個(gè)庫是maven中央庫。(曾經(jīng)研究過如何讓gradle和maven公用同一個(gè)本地倉庫,不過最后也是不了了之)。
dependencies中聲明了所有子模塊都需要使用的依賴項(xiàng)。這里用到了scala庫和spark庫,這兩個(gè)庫只會(huì)在編譯期用到,所以聲明使用的依賴類型是compileOnly(這種依賴類型是gradle Java插件獨(dú)有的,gradle scala插件繼承自java插件,所以也可以使用)。
task mkdirs是一個(gè)自定義任務(wù)。在根項(xiàng)目配置完settings.gradle和build.gradle后,執(zhí)行“gradle mkdirs”命令完成子模塊目錄的創(chuàng)建工作。
在兩個(gè)子模塊common和compute下創(chuàng)建build.gradle文件并做配置。
common模塊的build.gradle配置詳情:
project(':common') { dependencies { compile group: 'com.typesafe', name: 'config', version: '1.3.2' } }
這里只是聲明了一下commons模塊獨(dú)有的依賴項(xiàng)。
compute模塊是啟動(dòng)模塊,在該模塊中有spark任務(wù)的驅(qū)動(dòng)類。該模塊的build.gradle配置詳情:
project(':compute') { dependencies { compile project(":common") compileOnly group: 'org.apache.spark', name: 'spark-sql_2.10', version: sparkVersion compile group: 'net.liftweb', name: 'lift-json_2.10', version: '2.6.3' } jar { archiveName = 'consumer-portrait.jar' } task zip(type: Zip) { into('lib') { from(configurations.runtime) { include '*typesafe*', '*common*', '*bitmap-core*', '*RoaringBitmap*' } } into('') { from jar from 'doc' } } }
配置中的第一行dependencies仍然是配置compute模塊的依賴項(xiàng)。其中略需注意的是對(duì)common模塊的依賴。
接下來的jar聲明指明了將該模塊打成的jar包的名稱。腳本中需要根據(jù)包名來調(diào)用模塊生成的包,默認(rèn)生成的包名會(huì)帶上版本信息,不太合適。
最后是一個(gè)自定義任務(wù)。該任務(wù)的目標(biāo)是將一些必要的jar和其他文件打成一個(gè)zip包,以便于上傳任務(wù)到執(zhí)行服務(wù)器。任務(wù)中的第一個(gè)部分是將一些運(yùn)行時(shí)依賴打入zip包中的lib目錄,使用include關(guān)鍵字提示包含運(yùn)行時(shí)依賴中指定名稱的包,也可以使用exclude關(guān)鍵字排除一些包。第二部分是將生成的jar和本地doc目錄中的文件打入zip包的根目錄。
就這樣。有空再寫個(gè)示例項(xiàng)目留著參考。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
利用Gradle如何構(gòu)建scala多模塊工程的步驟詳解
這篇文章主要給大家介紹了關(guān)于如何利用Gradle構(gòu)建scala多模塊工程的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-04-04Scala實(shí)現(xiàn)二分查找的代碼實(shí)例
這篇文章主要介紹了Scala實(shí)現(xiàn)二分查找的代碼實(shí)例,找到數(shù)組的中間值,和需要查找的值進(jìn)行對(duì)比:如果中間值等于查找值,直接返回中間值下標(biāo);如果中間值大于查找值,則遞歸向左邊查找;如果中間值小于查找值,則遞歸向右邊查找,直到找完所有的元素,需要的朋友可以參考下2023-11-11淺談Scala的Class、Object和Apply()方法
下面小編就為大家?guī)硪黄獪\談Scala的Class、Object和Apply()方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-05-05