【发布时间】:2013-01-25 08:42:58
【问题描述】:
我正在尝试使用 sbt-assembly 将 scala 项目转换为可部署的 fat jar。当我在 sbt 中运行我的组装任务时,我收到以下错误:
Merging 'org/apache/commons/logging/impl/SimpleLog.class' with strategy 'deduplicate'
:assembly: deduplicate: different file contents found in the following:
[error] /Users/home/.ivy2/cache/commons-logging/commons-logging/jars/commons-logging-1.1.1.jar:org/apache/commons/logging/impl/SimpleLog.class
[error] /Users/home/.ivy2/cache/org.slf4j/jcl-over-slf4j/jars/jcl-over-slf4j-1.6.4.jar:org/apache/commons/logging/impl/SimpleLog.class
现在来自 sbt-assembly 文档:
如果多个文件共享相同的相对路径(例如,一个名为 application.conf 在多个依赖 JAR 中),默认策略是 验证所有候选人具有相同的内容和错误 否则。可以使用基于每个路径配置此行为 以下内置策略之一或编写自定义策略:
MergeStrategy.deduplicate是上述默认值MergeStrategy.first按类路径顺序选择第一个匹配的文件MergeStrategy.last选择最后一个MergeStrategy.singleOrError退出并显示冲突错误消息MergeStrategy.concat只是连接所有匹配的文件并包含结果MergeStrategy.filterDistinctLines也可以连接,但会沿途省略重复项MergeStrategy.rename重命名来自 jar 文件的文件MergeStrategy.discard只是丢弃匹配的文件
通过这个,我将 build.sbt 设置如下:
import sbt._
import Keys._
import sbtassembly.Plugin._
import AssemblyKeys._
name := "my-project"
version := "0.1"
scalaVersion := "2.9.2"
crossScalaVersions := Seq("2.9.1","2.9.2")
//assemblySettings
seq(assemblySettings: _*)
resolvers ++= Seq(
"Typesafe Releases Repository" at "http://repo.typesafe.com/typesafe/releases/",
"Typesafe Snapshots Repository" at "http://repo.typesafe.com/typesafe/snapshots/",
"Sonatype Repository" at "http://oss.sonatype.org/content/repositories/releases/"
)
libraryDependencies ++= Seq(
"org.scalatest" %% "scalatest" % "1.6.1" % "test",
"org.clapper" %% "grizzled-slf4j" % "0.6.10",
"org.scalaz" % "scalaz-core_2.9.2" % "7.0.0-M7",
"net.databinder.dispatch" %% "dispatch-core" % "0.9.5"
)
scalacOptions += "-deprecation"
mainClass in assembly := Some("com.my.main.class")
test in assembly := {}
mergeStrategy in assembly := mergeStrategy.first
在 build.sbt 的最后一行,我有:
mergeStrategy in assembly := mergeStrategy.first
现在,当我运行 SBT 时,我收到以下错误:
error: value first is not a member of sbt.SettingKey[String => sbtassembly.Plugin.MergeStrategy]
mergeStrategy in assembly := mergeStrategy.first
有人能指出我在这里做错了什么吗?
谢谢
【问题讨论】:
-
mergeStrategy现在已弃用。请改用assemblyMergeStrategy。我正在使用汇编版本0.14.10
标签: scala deployment sbt executable-jar sbt-assembly