28

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 ドキュメントから:

複数のファイルが同じ相対パスを共有する場合 (たとえば、複数の依存関係 JAR 内の application.conf という名前のリソース)、デフォルトの戦略は、すべての候補が同じ内容を持ち、そうでない場合はエラーになることを確認することです。この動作は、次の組み込み戦略のいずれかを使用するか、カスタム戦略を作成して、パスごとに構成できます。

  • MergeStrategy.deduplicate上記のデフォルトです
  • MergeStrategy.firstクラスパス順で最初に一致するファイルを選択します
  • MergeStrategy.last最後のものを選ぶ
  • MergeStrategy.singleOrError衝突時にエラーメッセージを表示して救済します
  • MergeStrategy.concat一致するすべてのファイルを単純に連結し、結果を含めます
  • MergeStrategy.filterDistinctLines連結もしますが、途中で重複を除外します
  • MergeStrategy.renamejar ファイルに由来するファイルの名前を変更します
  • 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

ここで私が間違っているかもしれないことを誰かが指摘できますか?

ありがとう

4

7 に答える 7

10

MergeStrategy.first大文字にするべきだと思うMのでmergeStrategy in assembly := MergeStrategy.first

于 2013-02-10T11:46:27.080 に答える
8

いくつかのmergeStrategiesを再配線する必要がある小さなsbtプロジェクトをセットアップしたところ、答えが少し古くなっていることがわかりました。バージョンの作業コードを追加させてください(2015年4月7日現在)

  • sbt 0.13.8
  • スカラ 2.11.6
  • アセンブリ 0.13.0

    mergeStrategy in assembly := {
      case x if x.startsWith("META-INF") => MergeStrategy.discard // Bumf
      case x if x.endsWith(".html") => MergeStrategy.discard // More bumf
      case x if x.contains("slf4j-api") => MergeStrategy.last
      case x if x.contains("org/cyberneko/html") => MergeStrategy.first
      case PathList("com", "esotericsoftware", xs@_ *) => MergeStrategy.last // For Log$Logger.class
      case x =>
         val oldStrategy = (mergeStrategy in assembly).value
         oldStrategy(x)
    }
    
于 2015-07-04T09:21:38.407 に答える
4

新しい sbt バージョン (sbt-version :0.13.11) では、slf4j のエラーが発生しました。当面は簡単な方法をとった:こちらの回答も確認してくださいScala SBT Assembly cannot merge due to de-duplication error in StaticLoggerBinder.class

assemblyMergeStrategy in assembly <<= (assemblyMergeStrategy in assembly) {
  (old) => {
    case PathList("META-INF", xs @ _*) => MergeStrategy.discard
    case x => MergeStrategy.first
  }
}
于 2016-07-15T10:53:26.573 に答える
1

クイック アップデート: mergeStrategy は非推奨です。assemblyMergeStrategy を使用します。それとは別に、以前の応答はまだしっかりしています

于 2019-02-22T18:01:58.980 に答える