복붙노트

[SCALA] 어떻게하게 IntelliJ IDEA와 함께 SBT를 사용하여 동네 짱의 JAR (지방 JAR)을 구축?

SCALA

어떻게하게 IntelliJ IDEA와 함께 SBT를 사용하여 동네 짱의 JAR (지방 JAR)을 구축?

나는 간단한 스칼라 프로젝트를 빌드 (인 IntelliJ의 IDEA와 함께) SBT를 사용하고 있습니다.

나는 동네 짱 JAR 파일 (일명 지방 JAR, 슈퍼 JAR)을 구축 할 수있는 간단한 방법이 무엇인지 알고 싶습니다.

나는 다음과 같은 오류가 아파치 스파크 내 JAR 파일을 제출 중있을 때 나는 현재 SBT를 사용하고 있지만 해요 :

또는 컴파일 시간 동안이 오류 :

내 일부 종속성이 서명 파일 최종 동네 짱의 JAR 파일에서 제거해야합니다 (META-INF)를 포함 때문입니다 것 같습니다.

나는 그 같은 SBT 조립 플러그인을 사용하려고 :

/project/assembly.sbt

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.12.0")

/project/plugins.sbt

logLevel := Level.Warn

/build.sbt

lazy val commonSettings = Seq(
  name := "Spark-Test"
  version := "1.0"
  scalaVersion := "2.11.4"
)

lazy val app = (project in file("app")).
  settings(commonSettings: _*).
  settings(
    libraryDependencies ++= Seq(
      "org.apache.spark" %% "spark-core" % "1.2.0",
      "org.apache.spark" %% "spark-streaming" % "1.2.0",
      "org.apache.spark" % "spark-streaming-twitter_2.10" % "1.2.0"
    )
  )

내가 "아티팩트를 작성 ..."를 클릭하면하게 IntelliJ IDEA에서 나는 JAR 파일을 얻을. 하지만이 같은 오류와 끝까지 ...

나는 SBT 새로운 매우하게 IntelliJ IDEA 경험이 아니에요.

감사.

해결법

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

    1.마지막으로 나는 완전히 내 세계 이해에 노이즈가 발생하지하게 IntelliJ IDEA를 사용하여 건너 :)

    마지막으로 나는 완전히 내 세계 이해에 노이즈가 발생하지하게 IntelliJ IDEA를 사용하여 건너 :)

    나는 공식 SBT 튜토리얼을 읽기 시작했다.

    나는 다음과 같은 파일 구조 내 프로젝트를 만든 :

    my-project/project/assembly.sbt
    my-project/src/main/scala/myPackage/MyMainObject.scala
    my-project/build.sbt
    

    내 assembly.sbt 파일의 SBT 조립 플러그인을 추가했습니다. 나 지방 JAR를 구축 할 수 있습니다 :

    addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.12.0")
    

    내 최소한의 build.sbt은 아래와 같다 :

    lazy val root = (project in file(".")).
      settings(
        name := "my-project",
        version := "1.0",
        scalaVersion := "2.11.4",
        mainClass in Compile := Some("myPackage.MyMainObject")        
      )
    
    libraryDependencies ++= Seq(
      "org.apache.spark" %% "spark-core" % "1.2.0" % "provided",
      "org.apache.spark" %% "spark-streaming" % "1.2.0" % "provided",
      "org.apache.spark" % "spark-streaming-twitter_2.10" % "1.2.0"
    )
    
    // META-INF discarding
    mergeStrategy in assembly <<= (mergeStrategy in assembly) { (old) =>
       {
        case PathList("META-INF", xs @ _*) => MergeStrategy.discard
        case x => MergeStrategy.first
       }
    }
    

    참고 : "제공"은 % 최종 지방 JAR의 의존성을 (해당 라이브러리가 이미 내 근로자에 ​​포함)을 포함하지 아니하는 의미

    참고 : META-INF는이 대답에 의해 영감을 폐기.

    참고 : %와의 의미 %%

    지금은 (설치 방법) 내 / 내 프로젝트의 루트 폴더에 다음 명령을 실행하여 SBT를 사용하여 내 지방 JAR을 구축 할 수 있습니다 :

    sbt assembly
    

    내 지방 JAR은 이제 새로운 생성 / 대상 폴더에 있습니다 :

    /my-project/target/scala-2.11/my-project-assembly-1.0.jar
    

    즉 다른 사람을 도움이되기를 바랍니다.

    인 IntelliJ의 IDEA와 함께 SBT를 포함하고자하는 사람들을 위해 어떻게하게 IntelliJ IDEA에서 SBT 조립 작업에서 실행?

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

    2.IntelliJ에 아이디어에서 건물 동네 짱의 JAR / 지방 JAR 3 단계 프로세스 :

    IntelliJ에 아이디어에서 건물 동네 짱의 JAR / 지방 JAR 3 단계 프로세스 :

    동네 짱 JAR / 지방 JAR : 그것은 모든 외부 라이브러리 의존성을 가진 JAR 파일.

    짜잔! 동네 짱 JAR가 내장되어 있습니다. JAR는 프로젝트 이름 / 대상 / 스칼라-XX에있을 것입니다

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

    3.프로젝트 / plugins.sbt에 다음 줄을 추가

    프로젝트 / plugins.sbt에 다음 줄을 추가

    addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.12.0")
    

    당신의 build.sbt에 다음을 추가

    mainClass in assembly := some("package.MainClass")
    assemblyJarName := "desired_jar_name_after_assembly.jar"
    
    val meta = """META.INF(.)*""".r
    assemblyMergeStrategy in assembly := {
      case PathList("javax", "servlet", xs @ _*) => MergeStrategy.first
      case PathList(ps @ _*) if ps.last endsWith ".html" => MergeStrategy.first
      case n if n.startsWith("reference.conf") => MergeStrategy.concat
      case n if n.endsWith(".conf") => MergeStrategy.concat
      case meta(_) => MergeStrategy.discard
      case x => MergeStrategy.first
    }
    

    총회 병합 전략은 지방 항아리를 만들 때 발생한 충돌을 해결하는 데 사용됩니다.

  4. from https://stackoverflow.com/questions/28459333/how-to-build-an-uber-jar-fat-jar-using-sbt-within-intellij-idea by cc-by-sa and MIT license