gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 03:01:00 25 4
gpt4 key购买 nike

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

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

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

最佳答案

您需要一个 mergeStrategy ,它将采用其中一个文件。

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

更新

如果你想根据它来自的 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)
}

}
build.sbt
mergeStrategy in assembly := {
case PathList("path", "to", "your", "DuplicatedClass.class") => new IncludeFromJar("jarname.jar")
case x => (mergeStrategy in assembly).value(x)
}

关于sbt - 如何从 sbt 程序集中排除重复的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24363363/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com