利用Gradle如何構建scala多模塊工程的步驟詳解

這篇文章主要給大家介紹了關於如何利用Gradle構建scala多模塊工程的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨着小編來一起學習學習吧。

前言

Scala是一門強大的語言,受到很多人的喜愛,我也曾經嘗試學習過。不過Scala官網專用的構建工具SBT就不那麼好用了。我曾經想將SBT的軟件包保存路徑設置到D盤,還想設置網絡代理,不過最後都沒搞明白怎麼回事。相信也有很多同學想學習Scala,但是卻被SBT擋在了門外。偶然之下我發現現在Gradle增加了scala插件,可以完美支持Scala項目。

前段時間終於無法忍受sbt慢如龜速的編譯打包速度了。稍稍調研了一下,就果斷切換到了gradle。由於調研得比較匆忙,在使用過程中遇到了各種問題。好在最後都能解決了。

我這裏使用scala主要是用來編寫spark job。由於我自己的一些需要,這些job中有幾個是多模塊的。在這裏簡單解釋一下如何使用gradle構建scala多模塊項目。

這裏用我最近開發的項目來做說明。項目名稱是consumer-portrait-job,有兩個子模塊:common和compute。

步驟如下

首先在項目根目錄下創建一個settings.gradle文件,這個文件主要用來描述項目名稱及子模塊信息:

rootProject.name = 'consumer-portrait-job'
include 'common', 'compute'

然後再創建一個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中央庫。(曾經研究過如何讓gradle和maven公用同一個本地倉庫,不過最後也是不了了之)。

dependencies中聲明瞭所有子模塊都需要使用的依賴項。這裏用到了scala庫和spark庫,這兩個庫只會在編譯期用到,所以聲明使用的依賴類型是compileOnly(這種依賴類型是gradle Java插件獨有的,gradle scala插件繼承自java插件,所以也可以使用)。

task mkdirs是一個自定義任務。在根項目配置完settings.gradle和build.gradle後,執行“gradle mkdirs”命令完成子模塊目錄的創建工作。

在兩個子模塊common和compute下創建build.gradle文件並做配置。

common模塊的build.gradle配置詳情:

project(':common') {
  dependencies {
    compile group: 'com.typesafe', name: 'config', version: '1.3.2'
  }
}

這裏只是聲明瞭一下commons模塊獨有的依賴項。

compute模塊是啓動模塊,在該模塊中有spark任務的驅動類。該模塊的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包的名稱。腳本中需要根據包名來調用模塊生成的包,默認生成的包名會帶上版本信息,不太合適。

最後是一個自定義任務。該任務的目標是將一些必要的jar和其他文件打成一個zip包,以便於上傳任務到執行服務器。任務中的第一個部分是將一些運行時依賴打入zip包中的lib目錄,使用include關鍵字提示包含運行時依賴中指定名稱的包,也可以使用exclude關鍵字排除一些包。第二部分是將生成的jar和本地doc目錄中的文件打入zip包的根目錄。

就這樣。有空再寫個示例項目留着參考。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對神馬文庫的支持。

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