使用 sbt-assembly 的 assembly-merge-strategy 问题 [英] assembly-merge-strategy issues using sbt-assembly
问题描述
我正在尝试使用 sbt-assembly 将 Scala 项目转换为可部署的胖 jar.当我在 sbt 中运行我的组装任务时,出现以下错误:
I am trying to convert a scala project into a deployable fat jar using sbt-assembly. When I run my assembly task in sbt I am getting the following error:
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 文档:
Now from the sbt-assembly documentation:
如果多个文件共享相同的相对路径(例如一个名为application.conf 在多个依赖 JAR 中),默认策略是验证所有候选人的内容相同并出错否则.可以使用以下方法在每个路径的基础上配置此行为以下任一内置策略或编写自定义策略:
If multiple files share the same relative path (e.g. a resource named application.conf in multiple dependency JARs), the default strategy is to verify that all candidates have the same contents and error out otherwise. This behavior can be configured on a per-path basis using either one of the following built-in strategies or writing a custom one:
MergeStrategy.deduplicate
是上面描述的默认值MergeStrategy.first
按类路径顺序选择第一个匹配的文件MergeStrategy.last
选择最后一个MergeStrategy.singleOrError
出现冲突时出现错误消息MergeStrategy.concat
简单地连接所有匹配的文件并包含结果MergeStrategy.filterDistinctLines
也进行连接,但在此过程中会忽略重复项MergeStrategy.rename
重命名源自 jar 文件的文件MergeStrategy.discard
只是丢弃匹配的文件
MergeStrategy.deduplicate
is the default described aboveMergeStrategy.first
picks the first of the matching files in classpath orderMergeStrategy.last
picks the last oneMergeStrategy.singleOrError
bails out with an error message on conflictMergeStrategy.concat
simply concatenates all matching files and includes the resultMergeStrategy.filterDistinctLines
also concatenates, but leaves out duplicates along the wayMergeStrategy.rename
renames the files originating from jar filesMergeStrategy.discard
simply discards matching files
通过这个,我设置了我的 build.sbt 如下:
Going by this I setup my build.sbt as follows:
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 的最后一行,我有:
In the last line of the build.sbt, I have:
mergeStrategy in assembly := mergeStrategy.first
现在,当我运行 SBT 时,出现以下错误:
Now, when I run SBT, I get the following error:
error: value first is not a member of sbt.SettingKey[String => sbtassembly.Plugin.MergeStrategy]
mergeStrategy in assembly := mergeStrategy.first
有人可以指出我在这里可能做错了什么吗?
Can somebody point out what I might be doing wrong here?
谢谢
推荐答案
我觉得应该是 MergeStrategy.first
加上大写的 M
,所以 mergeStrategy 在程序集:= MergeStrategy.first
.
I think it should be MergeStrategy.first
with a capital M
, so mergeStrategy in assembly := MergeStrategy.first
.
这篇关于使用 sbt-assembly 的 assembly-merge-strategy 问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!