복붙노트

[SCALA] 어셈블리 병합-전략 문제 SBT-어셈블리를 사용

SCALA

어셈블리 병합-전략 문제 SBT-어셈블리를 사용

나는 SBT-어셈블리를 사용하여 배포 지방 항아리에 스칼라 프로젝트를 변환하려합니다. 때 나는 다음과 같은 오류를 얻고있다 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 어셈블리 문서에서 :

다음과 같이 I 설정으로 내 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

내가 여기에 잘못된 일을 할 수있는 무엇을 누군가 지점 수 있습니까?

감사

해결법

  1. ==============================

    1.나는에 mergeStrategy 때문에 조립이, 자본 M으로 MergeStrategy.first을해야한다고 생각 : = MergeStrategy.first.

    나는에 mergeStrategy 때문에 조립이, 자본 M으로 MergeStrategy.first을해야한다고 생각 : = MergeStrategy.first.

  2. ==============================

    2.현재 버전 0.11.2 (2014년 3월 25일)에 관해서는, 병합 전략을 정의하는 방법이 다릅니다.

    현재 버전 0.11.2 (2014년 3월 25일)에 관해서는, 병합 전략을 정의하는 방법이 다릅니다.

    이 여기에 설명되어 있습니다, 관련 부분은 다음과 같습니다

    새로운 방법은 (동일한 소스에서 복사)한다 :

    mergeStrategy in assembly <<= (mergeStrategy in assembly) { (old) =>
      {
        case PathList("javax", "servlet", xs @ _*)         => MergeStrategy.first
        case PathList(ps @ _*) if ps.last endsWith ".html" => MergeStrategy.first
        case "application.conf" => MergeStrategy.concat
        case "unwanted.txt"     => MergeStrategy.discard
        case x => old(x)
      }
    }
    

    이것은이 변경되었을 때 내가 정확히 모르는뿐만 아니라 이전 버전의 가능성이 적용됩니다.

  3. ==============================

    3.난 그냥 설치를 요구 일부 mergeStrategies를 해킹 할 수있는 작은 SBT 프로젝트가 있고, 조금 오래된 답을 발견, 내가 (2015년 4월 7일 현재) 버전에 대한 내 작업 코드를 추가 할 수 있도록

    난 그냥 설치를 요구 일부 mergeStrategies를 해킹 할 수있는 작은 SBT 프로젝트가 있고, 조금 오래된 답을 발견, 내가 (2015년 4월 7일 현재) 버전에 대한 내 작업 코드를 추가 할 수 있도록

  4. ==============================

    4.새로운 SBT 버전 (SBT 버전 : 0.13.11)의 경우, 내가 SLF4J에 대한 오류를 얻고 있었다; 여기 스칼라 SBT 조립 꽤 수동으로 수행하기 위해 냉각되는 SBT 의존성 그래프 도구를 언급 StaticLoggerBinder.class에 기인하는 중복 제거 오류를 병합 할 수 없습니다 답을 확인하십시오 : 밖으로 당분간은 쉬운 방법을했다

    새로운 SBT 버전 (SBT 버전 : 0.13.11)의 경우, 내가 SLF4J에 대한 오류를 얻고 있었다; 여기 스칼라 SBT 조립 꽤 수동으로 수행하기 위해 냉각되는 SBT 의존성 그래프 도구를 언급 StaticLoggerBinder.class에 기인하는 중복 제거 오류를 병합 할 수 없습니다 답을 확인하십시오 : 밖으로 당분간은 쉬운 방법을했다

    assemblyMergeStrategy in assembly <<= (assemblyMergeStrategy in assembly) {
      (old) => {
        case PathList("META-INF", xs @ _*) => MergeStrategy.discard
        case x => MergeStrategy.first
      }
    }
    
  5. ==============================

    5.이것은 일반적인 자바 / 스칼라 프로젝트의 대부분을 병합하는 적절한 방법입니다. 그것은 META-INF와 클래스 처리합니다.

    이것은 일반적인 자바 / 스칼라 프로젝트의 대부분을 병합하는 적절한 방법입니다. 그것은 META-INF와 클래스 처리합니다.

    또한 META-INF에서 서비스 등록은 알아서한다.

    assemblyMergeStrategy in assembly := {
    case x if Assembly.isConfigFile(x) =>
      MergeStrategy.concat
    case PathList(ps @ _*) if Assembly.isReadme(ps.last) || Assembly.isLicenseFile(ps.last) =>
      MergeStrategy.rename
    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 _ => MergeStrategy.first}
    
  6. ==============================

    6.빠른 업데이트 : mergeStrategy가되지 않습니다. 사용 assemblyMergeStrategy. 그 외에도에서, 이전 응답은 여전히 ​​고체

    빠른 업데이트 : mergeStrategy가되지 않습니다. 사용 assemblyMergeStrategy. 그 외에도에서, 이전 응답은 여전히 ​​고체

  7. ==============================

    7.build.sbt에 다음은 소스 또는 대상으로 카프카를 추가하려면 추가

    build.sbt에 다음은 소스 또는 대상으로 카프카를 추가하려면 추가

     assemblyMergeStrategy in assembly := {
     case PathList("META-INF", xs @ _*) => MergeStrategy.discard
     //To add Kafka as source
     case "META-INF/services/org.apache.spark.sql.sources.DataSourceRegister" => 
     MergeStrategy.concat
     case x => MergeStrategy.first
     }
    
  8. from https://stackoverflow.com/questions/14791955/assembly-merge-strategy-issues-using-sbt-assembly by cc-by-sa and MIT license