2013-10-26 23 views
3

我想創建一個大的Jar文件。我正在嘗試使用SBT ASSEMBLY。我從GitHub answer安裝了sbt-assembly。當我跑sbt assembly,我得到這個錯誤:解決通過SBT程序集創建JAR時的依賴關係

java.lang.RuntimeException: deduplicate: different file contents found in the following: 
/home/UserName/.ivy2/cache/org.eclipse.jetty.orbit/javax.servlet/orbits/javax.servlet-2.5.0.v201103041518.jar:javax/servlet/SingleThreadModel.class 
/home/UserName/.ivy2/cache/org.mortbay.jetty/servlet-api/jars/servlet-api-2.5-20081211.jar:javax/servlet/SingleThreadModel.class 

爲了解決這個問題,我也跟着用戶的README頁面,這是他建議的代碼。

mergeStrategy in assembly <<= (mergeStrategy in assembly) { (old) => 
    { 
    case PathList("org", "apache", xs @ _*) => MergeStrategy.last 
    case PathList("javax", "servlet", xs @ _*) => MergeStrategy.last 
    case PathList("com", "esotericsoftware", xs @ _*) => MergeStrategy.last 
    case PathList("project.clj") => MergeStrategy.last 
    case PathList("overview.html") => MergeStrategy.last 
    case x => old(x) 
    } 
} 

即使在添加此代碼後,我也遇到了前面提到的相同錯誤。請讓我知道我缺少什麼。任何關於這個錯誤的幫助將不勝感激。謝謝!

更新2:

新增的排阻規則按所給的鏈接,

libraryDependencies ++= Seq("org.apache.spark" %% "spark-core" % "0.8.0-incubating","com.codahale" % "jerkson_2.9.1" % "0.5.0","org.skife.com.typesafe.config" % "typesafe-config" % "0.3.0").map(_.exclude("javax", "servlet")) 

更新3:

我可以找到導致問題的庫。

| +-org.apache.avro:avro-ipc:1.7.4 
| | +-io.netty:netty:3.4.0.Final (evicted by: 3.5.4.Final) 
| | +-io.netty:netty:3.5.4.Final 
... 
... 
| | +-org.mortbay.jetty:jetty-util:6.1.26 
| | +-org.mortbay.jetty:jetty:6.1.26 
| | | +-org.mortbay.jetty:jetty-util:6.1.26 
| | | +-org.mortbay.jetty:servlet-api:2.5-20081211 
| | | 
| | +-org.mortbay.jetty:servlet-api:2.5-20081211 
| | +-org.slf4j:slf4j-api:1.7.2 
... 
... 
| +-org.eclipse.jetty:jetty-server:7.6.8.v20121106 
| | +-org.eclipse.jetty.orbit:javax.servlet:2.5.0.v201103041518 

更新4:修復

因此增加MergeStrategy解決了問題。即使我有相當多的依賴關係,超過10個,添加MergeStrategy爲他們每個人單獨解決了這個問題。

回答

4

我認爲你正在嘗試治療症狀,但是你的問題實際上並不是組裝:你的項目在類路徑上有兩個不同版本的庫(javax.servlet)。

如果這些版本是二進制兼容的(我不知道),你可以通過排除構建文件like so中的兩個事件之一。如果它們不兼容,則需要展開您的依賴關係圖(這樣做的好方法可能是sbt-dependency-graph插件)並嘗試查找匹配的版本。

在任何情況下,(至少是暫時)將庫保存在項目文件夾中可能會有用。如果您將retrieveManaged in ThisBuild := true添加到您的sbt構建文件中,則會在<project-root>/lib_managed中找到所有庫。這可以讓你看到哪些罐子實際存在。


編輯:顯示的依賴關係圖:

添加到project/plugins.sbt

addSbtPlugin("net.virtual-void" % "sbt-dependency-graph" % "0.7.4") 

添加到build.sbt

net.virtualvoid.sbt.graph.Plugin.graphSettings 

然後運行sbt dependency-graph

+0

謝謝!實際上,我已經在sbt文件中添加了'retrieveManaged'參數。我可以在'lib_managed/jars/org.mortbay.jetty/servlet-api /'下看到引發此問題的jar。根據鏈接,我添加了[更新2,有問題],但我仍然面臨這個問題。如何找到導致問題的確切庫? – Learner

+1

你使用了依賴圖插件嗎?這應該可以幫助你找出罐子的來源。我已經添加了這些信息。 –

+0

我已經得到了上面的依賴關係tree.Any指針如何解決此MergeStrategy錯誤? – Learner

4

您也可以參考This Tech Blog

使用SBT組裝

這篇文章創建一個JAR的星火項目是關於如何創建使用SBT插件火花流項目中的脂肪罐子。 sbt-assembly是一個sbt插件,用於創建一個包含所有依賴的sbt項目的胖JAR。

相關問題