2016-05-30 84 views
3

我想在某些任務中覆蓋項目的依賴關係。 我有一個使用spark的sbt多項目。如何覆蓋sbt中某些任務的依賴關係

lazy val core = // Some Project 

val sparkLibs = Seq(
    "org.apache.spark" %% "spark-core" % "1.6.1" 
) 

val sparkLibsProvided = Seq(
    "org.apache.spark" %% "spark-core" % "1.6.1" % "provided" 
) 

lazy val main = Project(
    id = "main", 
    base = file("main-project"), 
    settings = sharedSettings 
).settings(
    name := "main", 
    libraryDependencies ++= sparkLibs, 
    dependencyOverrides ++= Set(
    "com.fasterxml.jackson.core" % "jackson-databind" % "2.4.4" 
) 
).dependsOn(core) 

當我嘗試在我的紗線羣上提交脂肪罐時,我使用https://github.com/sbt/sbt-assembly任務。但在這種情況下,我想使用的sparkLibssparkLibsProvided,而不是像這樣:

lazy val sparkProvided = (project in assembly).settings(
    dependencyOverrides ++= sparkLibsProvided.toSet 
) 

我怎樣才能正確地重寫此依賴?

+0

爲什麼你不能將這個依賴標記爲所有範圍的'provided'? – Sergey

+0

@Sergey我想在本地測試它,所以我需要沒有'provided'的依賴關係。我可以在本地測試我的項目時刪除'provieded',但是,我知道我很懶 – dazebug

+0

據我所知,'提供'範圍是專門用於'編譯'和'測試'範圍。如果你想通過運行一個主類而不是在測試中在本地進行測試,那麼你可以手動提供依賴關係:) – Sergey

回答

2

您可以創建一個新的項目,該項目是與提供的標誌創建火花尤伯杯罐子一個專門的項目:

lazy val sparkUberJar = (project in file("spark-project")) 
    .settings(sharedSettings: _*) 
    .settings(
    libraryDependencies ++= sparkLibsProvided, 
    dependencyOverrides ++= Set(
     "com.fasterxml.jackson.core" % "jackson-databind" % "2.4.4" 
    ) 
) 

而當你在SBT組裝,去該工程第一:

sbt project sparkUberJar 
sbt assembly 
0

這可以通過使用專門提供的key可以輕鬆實現你想要什麼:

assemblyExcludedJars in assembly := { 
    val cp = (fullClasspath in assembly).value 
    cp filter { 
    _.data.getName == "spark-core-1.6.1.jar" 
    } 
} 

這種做法被認爲是哈克,但它會更好,如果你設法拆分配置成子項目,如官方文件here中也警告說:

如果你需要告訴SBT組裝忽視JAR,你可能做錯了。組裝任務從項目的​​類路徑抓取JAR。先嚐試修復類路徑。