首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用org.apache.arrow的sbt-程序集去重错误

使用org.apache.arrow的sbt-程序集去重错误
EN

Stack Overflow用户
提问于 2019-01-08 15:01:01
回答 3查看 1.5K关注 0票数 3

我正在使用sbt 1.2.8和sbt-程序集0.14.9。我正试图为我的项目构建一个使用Spark + Akka + gRPC的胖罐子。一开始我有很多去重复错误;除了1之外,我设法解决了所有问题,几个小时后我一直找不到解决这个问题的方法。

这是我从sbt assembly获得的错误消息

代码语言:javascript
复制
[error] (assembly) deduplicate: different file contents found in the following:
[error] /Users/samedduzcay/.ivy2/cache/org.apache.arrow/arrow-vector/jars/arrow-vector-0.10.0.jar:git.properties
[error] /Users/samedduzcay/.ivy2/cache/org.apache.arrow/arrow-format/jars/arrow-format-0.10.0.jar:git.properties
[error] /Users/samedduzcay/.ivy2/cache/org.apache.arrow/arrow-memory/jars/arrow-memory-0.10.0.jar:git.properties

这是我的build.sbt

代码语言:javascript
复制
import sbt.Keys._
import sbtassembly.AssemblyPlugin.autoImport.PathList

name := "xxx"

version := "1.0"

lazy val sv = "2.11.12"
scalaVersion := sv

lazy val akkaVersion = "2.5.19"
lazy val sparkVersion = "2.4.0"

enablePlugins(AkkaGrpcPlugin)
enablePlugins(JavaAgent)
javaAgents += "org.mortbay.jetty.alpn" % "jetty-alpn-agent" % "2.0.9" % "runtime;test"

test in assembly := {}
logLevel in assembly := Level.Debug

lazy val root = (project in file(".")).
settings(
  inThisBuild(List(
    organization := "com.smddzcy",
    scalaVersion := sv
  )),
  name := "xxx",
  libraryDependencies ++= Seq(
    "org.apache.spark" %% "spark-core" % sparkVersion,
    "org.apache.spark" %% "spark-sql" % sparkVersion,
    "org.mariadb.jdbc" % "mariadb-java-client" % "2.3.0",
    "com.typesafe.akka" %% "akka-actor" % akkaVersion,
    "com.typesafe.akka" %% "akka-protobuf" % akkaVersion,
    "com.typesafe.akka" %% "akka-stream" % akkaVersion,
    // "com.google.guava" % "guava" % "27.0.1-jre" % Compile,
    // "org.apache.httpcomponents" % "httpcore" % "4.4.10" % Compile,
    "com.typesafe.akka" %% "akka-stream-testkit" % akkaVersion % Test,
    "org.scalatest" %% "scalatest" % "3.0.5" % Test
  )
)

assemblyMergeStrategy in assembly := {
  case PathList(pl@_*) if pl.contains("log4j.properties") => MergeStrategy.concat
  case PathList("META-INF", "io.netty.versions.properties") => MergeStrategy.last
  case PathList("org", "aopalliance", xs@_*) => MergeStrategy.first
  case PathList("javax", "inject", xs@_*) => MergeStrategy.first
  case PathList("javax", "servlet", xs@_*) => MergeStrategy.first
  case PathList("javax", "activation", xs@_*) => MergeStrategy.first
  case PathList("org", "commons-collections", x@_*) => MergeStrategy.first
  case PathList("org", "apache", xs@_*) => MergeStrategy.first
  case PathList("com", "google", xs@_*) => MergeStrategy.first
  case "about.html" => MergeStrategy.rename
  case "META-INF/ECLIPSEF.RSA" => MergeStrategy.first
  case "META-INF/mailcap" => MergeStrategy.first
  case "META-INF/mimetypes.default" => MergeStrategy.first
  case "plugin.properties" => MergeStrategy.first
  case "application.conf" => MergeStrategy.concat
  case "reference.conf" => MergeStrategy.concat
  case x =>
    val oldStrategy = (assemblyMergeStrategy in assembly).value
    oldStrategy(x)
}

我可能在assemblyMergeStrategy中遗漏了一些东西(或者有些额外的东西)。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-01-08 15:28:43

assemblyMergeStrategy更新为此解决了以下问题:

代码语言:javascript
复制
assemblyMergeStrategy in assembly := {
  case PathList("META-INF", xs @ _*) =>
    xs map {_.toLowerCase} match {
      case "manifest.mf" :: Nil | "index.list" :: Nil | "dependencies" :: Nil =>
        MergeStrategy.discard
      case ps @ x :: xs if ps.last.endsWith(".sf") || ps.last.endsWith(".dsa") =>
        MergeStrategy.discard
      case "plexus" :: xs =>
        MergeStrategy.discard
      case "services" :: xs =>
        MergeStrategy.filterDistinctLines
      case "spring.schemas" :: Nil | "spring.handlers" :: Nil =>
        MergeStrategy.filterDistinctLines
      case _ => MergeStrategy.first
    }
  case "application.conf" => MergeStrategy.concat
  case "reference.conf" => MergeStrategy.concat
  case _ => MergeStrategy.first
}

注意,case PathList("META-INF", xs @ _*) =>部分来自sbt-assembly的默认合并策略,我只是将最后一位case _ => MergeStrategy.deduplicate更改为case _ => MergeStrategy.first

票数 7
EN

Stack Overflow用户

发布于 2019-01-08 15:11:37

在我的例子中,我在build.sbt中使用了以下代码,如果在构建过程中发现任何副本,它将有条件地接受第一个文件-

代码语言:javascript
复制
assemblyMergeStrategy in assembly := {
   case PathList("META-INF", xs @ _*) => MergeStrategy.discard
   case x => MergeStrategy.first
}
票数 3
EN

Stack Overflow用户

发布于 2019-01-08 17:19:22

我认为,由于您与git.properties文件之间的冲突,您可以为该文件添加一个案例:

代码语言:javascript
复制
case "git.properties"                              => MergeStrategy.first
// or
case "git.properties"                              => MergeStrategy.concat

作为完全合并策略,如下所示:

代码语言:javascript
复制
assemblyMergeStrategy in assembly := {
  // ... other directives
  case "application.conf"                            => MergeStrategy.concat
  case "log4j.properties"                            => MergeStrategy.first
  case "unwanted.txt"                                => MergeStrategy.discard
  // ... other directives
  case "git.properties"                              => MergeStrategy.first
  // or maybe: case "git.properties"                              => MergeStrategy.concat
  case x =>
    val oldStrategy = (assemblyMergeStrategy in assembly).value
    oldStrategy(x)
}

试一试,看看它是否解决了问题

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54094482

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档