如何从sbt程序集中排除重复的类?

Cha*_*ton 10 sbt sbt-assembly

我们的情况是两个依赖项具有完全相同的类(因为其中一个依赖项复制了它并包含在它们自己的源中).

这导致sbt assembly其重复数据删除检查失败.

如何从特定的jar中排除某个类?

lpi*_*ora 18

你需要一个mergeStrategy,它将采取其中一个文件.

mergeStrategy in assembly := {
    case PathList("path", "to", "your", "DuplicatedClass.class") => MergeStrategy.first
    case x => (mergeStrategy in assembly).value(x)
}
Run Code Online (Sandbox Code Playgroud)

更新

如果你想根据它来自的JAR处理文件,我认为你不能使用程序集插件定义的合并策略.您可以做什么,您可以定义自己的策略.

我会改变你的状况.我认为问题应该是"如何从特定的JAR中包含一个类?".原因是可以有两个以上的JAR具有相同的类,并且最后只能包含一个.

您可以通过使用来判断文件的来源AssemblyUtils.sourceOfFileForMerge.

project/IncludeFromJar.scala

import sbtassembly._
import java.io.File
import sbtassembly.Plugin.MergeStrategy

class IncludeFromJar(val jarName: String) extends MergeStrategy {

  val name = "includeFromJar"

  def apply(args: (File, String, Seq[File])): Either[String, Seq[(File, String)]] = {
    val (tmp, path, files) = args
    val includedFiles = files.flatMap { f =>
      val (source, _, _, isFromJar) = sbtassembly.AssemblyUtils.sourceOfFileForMerge(tmp, f)
      if(isFromJar && source.getName == jarName) Some(f -> path) else None
    }
    Right(includedFiles)
  }

}
Run Code Online (Sandbox Code Playgroud)

build.sbt

mergeStrategy in assembly := {
    case PathList("path", "to", "your", "DuplicatedClass.class") => new IncludeFromJar("jarname.jar")
    case x => (mergeStrategy in assembly).value(x)
}
Run Code Online (Sandbox Code Playgroud)