利用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)目可以使用的倉(cāng)庫(kù)。這里使用的第一個(gè)倉(cāng)庫(kù)是本機(jī)的maven庫(kù),第二庫(kù)是ali提供的repository服務(wù),第三個(gè)庫(kù)是maven中央庫(kù)。(曾經(jīng)研究過如何讓gradle和maven公用同一個(gè)本地倉(cāng)庫(kù),不過最后也是不了了之)。
dependencies中聲明了所有子模塊都需要使用的依賴項(xiàng)。這里用到了scala庫(kù)和spark庫(kù),這兩個(gè)庫(kù)只會(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ì)我們的支持。
上一篇:linux下搭建scala環(huán)境并寫個(gè)簡(jiǎn)單的scala程序
欄 目:Scala
本文標(biāo)題:利用Gradle如何構(gòu)建scala多模塊工程的步驟詳解
本文地址:http://mengdiqiu.com.cn/a1/Scala/12000.html
您可能感興趣的文章


閱讀排行
- 1C語言 while語句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語言實(shí)現(xiàn)“百馬百擔(dān)”問題方法
- 4C語言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 01-11php下關(guān)于Cannot use a scalar value as an ar
- 01-11PHP警告Cannot use a scalar value as an array的
- 01-11Windows7下安裝Scala 2.9.2教程
- 01-11淺談Scala的Class、Object和Apply()方法
- 01-11深入理解Scala函數(shù)式編程過程
- 01-11Scala基礎(chǔ)簡(jiǎn)介及代碼示例
- 01-11Scala安裝及環(huán)境圖文配置教程
- 01-11linux下搭建scala環(huán)境并寫個(gè)簡(jiǎn)單的sca
- 01-11利用Gradle如何構(gòu)建scala多模塊工程的步
- 01-11Scala的文件讀寫操作與正則表達(dá)式
隨機(jī)閱讀
- 01-10delphi制作wav文件的方法
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 04-02jquery與jsp,用jquery
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10C#中split用法實(shí)例總結(jié)
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-11ajax實(shí)現(xiàn)頁面的局部加載