sbt:如何编写MergeStrategy来选择特定的库版本

时间:2014-06-26 02:18:42

标签: merge duplicates sbt

以下是尝试排除javax.servlet类:

libraryDependencies ++= Seq(
 ..
  ("org.apache.spark" % "spark-core_2.10" % sparkVersion  \
  % "compile->default"  withSources()).exclude("org.mortbay.jetty", "servlet-api"),

以下是我对MergeStrategy的尝试:

mergeStrategy in assembly <<= (mergeStrategy in assembly) { (old) => {
 ..
    case PathList("javax", "servlet", xs @ _*)         => MergeStrategy.singleOrError
   ..

以下显示正在加载javax.servlet类的多个副本:

  

[error](*:assembly)singleOrError:找到相同的多个文件   目标路径:[错误]   C:\ Users \用户s80035683.ivy2 \缓存\ org.mortbay.jetty \ servlet的API-2.5 \罐\ servlet的API-2.5-6.1.14.jar:的javax / servlet的/ Filter.class   [错误]   C:\ Users \用户s80035683.ivy2 \缓存\的javax.servlet \ servlet的API \罐\ servlet的API-2.5.jar:的javax / servlet的/ Filter.class   [错误]   C:\ Users \用户s80035683.ivy2 \缓存\ org.eclipse.jetty.orbit \的javax.servlet \轨道\的javax.servlet-3.0.0.v201112011016.jar:的javax / servlet的/ Filter.class   [错误]   C:\ Users \用户s80035683.ivy2 \缓存\ org.mortbay.jetty \ servlet的API \罐\ servlet的API-2.5-20110124.jar:的javax / servlet的/ Filter.class

注意:这不是DUPLICATE,因为类似的问题不能解决这个问题。例如+以下问题的答案(“默认选择的最高版本”)不起作用

  

How could SBT choose highest version amongst dependencies?

1 个答案:

答案 0 :(得分:1)

您可以使用sbt-dependency-graph并查看servlet-api所在的位置作为传递依赖项。

您可以使用what-depends-on <organization> <module> <revision>命令执行此操作。

知道你可以排除传递依赖。

这比从特定jar中排除类更容易(除非你不关心哪个jar,你只想从任何jar中获取它)。

您还可以查看我对another question的答案,了解如何编写自定义MergeStrategy,这将知道该课程来自哪个jar。