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

