2014-01-15 36 views
2

我正在用SBT構建一個Spark項目。更改庫SBT中特定代碼段的依賴關係?

當我包含一個庫依賴項,程序的一部分將工作,另一部分將拋出一個異常(因爲在libraryDependencies中指定了錯誤的版本)。當我刪除libraryDependencies時,這是相反的。

有沒有辦法在編譯或運行時動態更改libraryDependencies(更改版本)?

到(僞)類似:

libraryDependencies.set("org.apache.hadoop.hadoop-client", "2.0.0-cdh4.5.0") 

// here comes the code depending on hadoop-client" % "2.0.0-cdh4.5.0 

libraryDependencies.set("org.apache.hadoop.hadoop-client", "1.0.4") 

// here comes the code depending on hadoop-client" % "1.0.4 

難道這由scoping做?

+0

您如何期望在編譯和運行時擁有不同版本的庫?您可能會根據其他設置進行不同的設置,但您所追求的內容對我來說沒有意義。需要更多的幫助來理解這個問題。您想在不同的CodeBlocks中添加什麼?我認爲你需要不同的模塊,有效地創建[多項目構建](http://www.scala-sbt.org/release/docs/Getting-Started/Multi-Project.html)。 –

+0

謝謝你的評論@JacekLaskowski 也許我應該更好地表達它,我想依賴程序不同部分的不同圖書館。 (這裏:我想使用一個版本的庫從HDFS中讀取數據,然後使用該庫的另一個版本(mapreduce)將此文件寫入到Cassandra中。這是否可以用於多項目構建? – daumann

+0

您應該將註釋添加到因爲它使得它更容易理解,你應該明確地使用多項目構建,其中有兩個模塊 - HDFS閱讀器和Cassandra編寫器。它們是獨立的,因爲你已經指出(不僅因爲它們使用的庫)。 –

回答

0

如果你需要兩個版本 - 1.0.42.0.0-cdh4.5.0 - 同樣依賴org.apache.hadoop.hadoop-client在一個單一的項目它迴避了兩個模塊,每個模塊包含依賴於任何依賴代碼中的多模塊構建配置。

在一個項目,說projectA你有1.0.4依賴和使用它,而在另一個,說projectB2.0.0-cdh4.5.0與代碼的其它部分的代碼。

隨着中說,build.sbt可以看看如下:

lazy val projectA, projectB = project 

libraryDependencies in projectA += "org.apache.hadoop" % "hadoop-client" % "1.0.4" 

libraryDependencies in projectB += "org.apache.hadoop" % "hadoop-client" % "2.0.0-cdh4.5.0" 

隨着構建配置,你跟着代碼/模塊分離。

您也可以在每個項目的build.sbt中定義這些libraryDependencies設置,最終結果與上面相同。