SBT Multi-projects 配置

Spark簡(jiǎn)介

Spark已經(jīng)成為一個(gè)很熱門的數(shù)據(jù)分析和計(jì)算工具,它支持多種語言(Java,python,scala,R),而spark本身是由scala編寫而成的,所以推薦第一次接觸spark使用scala來編寫spark程序,支持度比較高.

Build Tool

跟Java的maven一樣,scala可以使用SBT(Simple Build Tool)來構(gòu)建build項(xiàng)目結(jié)構(gòu),SBT名字上叫做一種“簡(jiǎn)單的構(gòu)建工具”,其實(shí)個(gè)人覺得對(duì)新手并不是十分簡(jiǎn)單,可能是大家都習(xí)慣了Maven的方式吧. SBT具體的文檔介紹可以自行參考SBT文檔

SBT Multi-project 簡(jiǎn)單配置

在實(shí)際項(xiàng)目當(dāng)中,大家都可能碰到多個(gè)項(xiàng)目放在一個(gè)目錄下,需要獨(dú)立運(yùn)行,且各個(gè)子項(xiàng)目之間通過lib包依賴的情況,SBT也支持這種工程的build,下面簡(jiǎn)單介紹下如何定義目錄結(jié)構(gòu)和build文件:

SBT工程目錄結(jié)構(gòu)

可以按如下方式創(chuàng)建一個(gè)完整的工程目錄:

圖 3-1 SBT工程目錄結(jié)構(gòu)
  • test-project/build.sbt: 是主工程根目錄下的build文件,可以將主工程的包信息放在里面,一般來說最簡(jiǎn)單的sbt build環(huán)境就是只有根目錄下的build文件,參考內(nèi)容下:
name := "test-project"
version := "1.0"
scalaVersion := "2.10.6"
  • test-project/project/build.scala: 每個(gè)根目錄/project目錄下可以放置一個(gè)build.sbt或者build.scala文件(SBT支持兩種后綴方式的文件,具體可以參考SBT文檔,這里不展開介紹),里面定義所有模塊或者項(xiàng)目的build方式(包含主工程和子工程),所有build.scala里的內(nèi)容在根目錄下的build.sbt(也就是test-project/build.sbt)里面都是可見的,參考內(nèi)容如下:
import sbt._
object MainProjectBuild extends Build {
  val sparkCore = "org.apache.spark" %% "spark-core" % "1.6.1" % "provided"
  val sparkHive = "org.apache.spark" %% "spark-hive" % "1.6.1" % "provided"
  val env = Option(System.getProperty("env")).getOrElse("dev")
    lazy val root = Project(
        id = "root", 
        base = file(".")
    ) aggregate(project1, project2, project3) settings(libraryDependencies ++= Seq(sparkCore, sparkHive)) 
    lazy val project1 = Project(
        id = "project1",
        base = file("project1")
    ) dependsOn(project2, project3) settings(libraryDependencies ++= Seq(sparkCore, sparkHive))
    lazy val project2= Project(
        id = "project2",
        base = file("project2"),
    ) settings(libraryDependencies ++= Seq(sparkCore, sparkHive)) 
    lazy val project3 = Project(
        id = "project3",
        base = file("project3")
    ) settings(libraryDependencies ++= Seq(sparkCore, sparkHive))
}

定義一個(gè)MainProjectBuild繼承Build類,假設(shè)我們有三個(gè)子project,project1依賴2,3才能生成,root-project通過aggregate來指定并行生成三個(gè)子項(xiàng)目,每個(gè)子項(xiàng)目target下都會(huì)產(chǎn)生一個(gè)package,而project1通過dependsOn指定了project2,project3作為其依賴的一部分,每當(dāng)project1編譯的時(shí)候,必須先編譯project2,project3,并且把2,3的代碼作為project1的classpath一部分,然后project1才能編譯,這樣工程之間就實(shí)現(xiàn)了依賴,同時(shí)又維持了project2,project3包的獨(dú)立性

  • test-project/project1/build.sbt: 各個(gè)子項(xiàng)目的包定義信息,具體如下所示:
organization := "test.p1"
name := "test-project-one"
version := "1.0"
scalaVersion := "2.10.5"

test-project/project2/build.sbt 和 test-project/project3/build.sbt都是一樣的配置,這樣每個(gè)子項(xiàng)目生成包名字信息都是根據(jù)其目錄下的build.sbt來指定的.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容