需要一个路径列表模式来让 sbt 开心

Need a pathlist pattern to make sbt happy

因此,有了一个依赖,我就进入了一种我无法逃脱的纠缠状态。我不想去想当我带上评论的罐子时会发生什么:

libraryDependencies ++= Seq(
//  "org.apache.avro" % "avro" % "1.8.1" excludeAll ExclusionRule(organization = "log4j"),
//  "org.apache.kafka" %% "kafka" % "0.10.0.0",
  "org.apache.hive" % "hive-jdbc" % "1.2.2"
    excludeAll ExclusionRule(organization = "log4j")
    exclude("org.apache.hadoop", "hadoop-yarn-api"),
  "log4j" % "log4j" % "1.2.16"
)

使用 sbt 程序集,我遇到了以下重复数据删除问题:

[error] (*:assembly) deduplicate: different file contents found in the following:
[error] C:\Users\G517329\.ivy2\cache\org.datanucleus\datanucleus-api-jdo\jars\datanucleus-api-jdo-3.2.6.jar:plugin.xml
[error] C:\Users\G517329\.ivy2\cache\org.datanucleus\datanucleus-core\jars\datanucleus-core-3.2.10.jar:plugin.xml
[error] C:\Users\G517329\.ivy2\cache\org.datanucleus\datanucleus-rdbms\jars\datanucleus-rdbms-3.2.9.jar:plugin.xml

我被困的地方是试图找到一种合并策略,允许这三个罐子愉快地共存在一个胖罐子里。我已经尝试了以下策略的多种变体,但没有取得任何进展:

assemblyMergeStrategy in assembly := {
  case PathList("javax", "transaction", xs @ _*) => MergeStrategy.first
  case PathList(xs @ _*) if xs.last endsWith "plugin.xml" => MergeStrategy.discard
  // case PathList("org", "datanucleus", "datanucleus-api-jdo", xs @ _*) => MergeStrategy.last
  // case PathList("org", "datanucleus", "datanucleus-rdbms", xs @ _*) => MergeStrategy.last
  case PathList("META-INF", xs @ _*) => MergeStrategy.discard
  case x =>
    val oldStrategy = (assemblyMergeStrategy in assembly).value
    oldStrategy(x)
}

我一定对它的工作原理有一些误解,因为在我看来第二行应该找到每个 jar 中的每个 plugin.xml 文件并对其进行核对。

有没有人成功地将 hive-jdbc 包含在 fat jar 中?

更新:

case "plugin.xml" => MergeStrategy.discard //or .last 应该工作,我想,但是抛出:

[error] (*:assembly) java.util.NoSuchElementException

所以我今天早上加载了这个项目,再试一次。这次

case "plugin.xml" => MergeStrategy.last

不扔了,我有一个胖罐

咕.

更新:

我不知道问题出在哪里(Intellij、SBT 控制台、sbt-assembly),但是正在进行一些缓存,这使得解决合并问题变得非常困难。我发现确保我对 build.sbt 中的代码所做的更改得到实际应用的唯一可靠方法是关闭整个 IDE 并重新打开它。