Use sbt mergeStrategy for reference.conf files.
Cleans up #158 / 509b721
.
This commit is contained in:
parent
509b721d12
commit
039b41cb54
|
@ -1,7 +1,5 @@
|
|||
import sbt._
|
||||
import Keys._
|
||||
import classpath.ClasspathUtilities.isArchive
|
||||
import java.io.FileOutputStream
|
||||
import sbtassembly.Plugin._
|
||||
import AssemblyKeys._
|
||||
|
||||
|
@ -71,12 +69,12 @@ object SparkBuild extends Build {
|
|||
"cc.spray" % "spray-can" % "1.0-M2.1",
|
||||
"cc.spray" % "spray-server" % "1.0-M2.1"
|
||||
)
|
||||
) ++ assemblySettings ++ extraAssemblySettings ++ mergeSettings
|
||||
) ++ assemblySettings ++ extraAssemblySettings
|
||||
|
||||
def replSettings = sharedSettings ++ Seq(
|
||||
name := "spark-repl",
|
||||
libraryDependencies <+= scalaVersion("org.scala-lang" % "scala-compiler" % _)
|
||||
) ++ assemblySettings ++ extraAssemblySettings ++ mergeSettings
|
||||
) ++ assemblySettings ++ extraAssemblySettings
|
||||
|
||||
def examplesSettings = sharedSettings ++ Seq(
|
||||
name := "spark-examples"
|
||||
|
@ -84,60 +82,10 @@ object SparkBuild extends Build {
|
|||
|
||||
def bagelSettings = sharedSettings ++ Seq(name := "spark-bagel")
|
||||
|
||||
// Fix for "No configuration setting found for key 'akka.version'" exception
|
||||
// when running Spark from the jar generated by the "assembly" task; see
|
||||
// http://letitcrash.com/post/21025950392/howto-sbt-assembly-vs-reference-conf
|
||||
lazy val merge = TaskKey[File]("merge-reference",
|
||||
"merge all reference.conf")
|
||||
|
||||
lazy val mergeSettings: Seq[Project.Setting[_]] = Seq(
|
||||
merge <<= (fullClasspath in assembly) map {
|
||||
c =>
|
||||
// collect from all elements of the full classpath
|
||||
val (libs, dirs) =
|
||||
c map (_.data) partition (isArchive)
|
||||
// goal is to simply concatenate files here
|
||||
val dest = file("reference.conf")
|
||||
val out = new FileOutputStream(dest)
|
||||
val append = IO.transfer(_: File, out)
|
||||
try {
|
||||
// first collect from managed sources
|
||||
(dirs * "reference.conf").get foreach append
|
||||
// then from dependency jars by unzipping and
|
||||
// collecting reference.conf if present
|
||||
for (lib <- libs) {
|
||||
IO withTemporaryDirectory {
|
||||
dir =>
|
||||
IO.unzip(lib, dir, "reference.conf")
|
||||
(dir * "reference.conf").get foreach append
|
||||
}
|
||||
}
|
||||
// return merged file location as task result
|
||||
dest
|
||||
} finally {
|
||||
out.close()
|
||||
}
|
||||
},
|
||||
|
||||
// get rid of the individual files from jars
|
||||
excludedFiles in assembly <<=
|
||||
(excludedFiles in assembly) {
|
||||
(old) => (bases) =>
|
||||
old(bases) ++ (bases flatMap (base =>
|
||||
(base / "reference.conf").get))
|
||||
},
|
||||
|
||||
// tell sbt-assembly to include our merged file
|
||||
assembledMappings in assembly <<=
|
||||
(assembledMappings in assembly, merge) map {
|
||||
(old, merged) => (f) =>
|
||||
old(f) :+(merged, "reference.conf")
|
||||
}
|
||||
)
|
||||
|
||||
def extraAssemblySettings() = Seq(test in assembly := {}) ++ Seq(
|
||||
mergeStrategy in assembly := {
|
||||
case m if m.toLowerCase.endsWith("manifest.mf") => MergeStrategy.discard
|
||||
case "reference.conf" => MergeStrategy.concat
|
||||
case _ => MergeStrategy.first
|
||||
}
|
||||
)
|
||||
|
|
Loading…
Reference in a new issue