2015-08-13 2 views
1

Я создаю приложение и пытаюсь упаковать его в виде толстой банки через сборку sbt, но мой класс не включается в окончательный файл jar. Он включает в себя зависимости двух дополнительных файлов jar, которые я создал. Мой код выглядит примерно так:SBT: Класс, не включенный в файл jar

package com.my.new.pacakge 

import com.my.package.num1 
import com.my.package.num2 

object myNewObject { ....} 

Мой файл сборки выглядит следующим образом:

organization := "com.my.new.package" 

name := "myProject" 

spName := "com.my.new.package/myNewObject" 

version := "0.2" 

scalaVersion := "2.10.4" 

sparkVersion := "1.3.0" 

sparkComponents ++= Seq("streaming", "sql") 

libraryDependencies += "com.databricks" %% "spark-avro" % "1.0.0" 

libraryDependencies += "org.apache.avro" % "avro" % "1.7.7" 

libraryDependencies += "org.apache.avro" % "avro-mapred" % "1.7.7" 

libraryDependencies += "com.my.package" % "num1" % "0.1" 

libraryDependencies += "com.my.package" % "num2" % "0.2" 

mergeStrategy in assembly := {case PathList("META-INF", xs @ _*) => MergeStrategy.discard 
           case x => MergeStrategy.concat} 

lazy val sbtAssemblySettings = Seq(
    assemblyJarName in assembly := {name.value + "-" + version.value + ".jar"}, 
    mainClass in assembly := Some("com.my.new.package.myNewObject") 
) 

Когда я бегу в сборе, то банку Pacakges просто отлично, но если я бегу «банку ТФ», чтобы увидеть, что находится в банке, ничего не связано с com.my.new.package. Все остальное, кажется, есть.

Существуют некоторые общие зависимости между моими другими банками и этим новым объектом, которые создают некоторые конфликты, а следовательно, стратегию слияния. Я подозреваю, что в стратегии слияния вызывается myNewObject, но я не совсем уверен, почему. Если кто-то может указать, что я делаю неправильно, это очень ценится.

ответ

2

case x => MergeStrategy.concat

Я думаю, что означает, что все ваши файлы, кроме META-INF зажаты вместе в одном. Вероятно, вы захотите использовать стратегию по умолчанию для всего, что не соответствует вашему фильтру. Из README:

assemblyMergeStrategy in assembly := { 
    case PathList("META-INF", xs @ _*) => MergeStrategy.discard 
    case x => 
    val oldStrategy = (assemblyMergeStrategy in assembly).value 
    oldStrategy(x) 
} 
+0

К сожалению, когда я использую вышеизложенное, он больше не разрешает конфликты для многих вещей. Все они, похоже, являются элементами, содержащимися в моем каталоге .ivy2. Я попытался добавить случай, в котором говорится «case PathList («. Ivy2 », xs @ _ *) => MergeStrategy.concat», но я не уверен, что правильно написал это, поскольку он все еще не разрешает конфликты. –

Смежные вопросы