Skip to content

Commit

Permalink
Add a setting allowing to append SHA-1 to the result artifact name
Browse files Browse the repository at this point in the history
  • Loading branch information
kciesielski committed Sep 27, 2013
1 parent 326eb67 commit 4bccd9f
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 19 deletions.
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -234,6 +234,12 @@ To make a jar containing only the dependencies, type

NOTE: If you use [`-jar` option for `java`](http://docs.oracle.com/javase/7/docs/technotes/tools/solaris/java.html#jar), it will ignore `-cp`, so if you have multiple jars you have to use `-cp` and pass the main class: `java -cp "jar1.jar:jar2.jar" Main`

You can also append SHA-1 fingerprint to the assembly file name, this may help you to determine whether it has changed and, for example, if it's necessary to deploy the dependencies,

```scala
appendContentHash in assembly-package-dependency := true
```

### Caching

By default for performance reasons, the result of unzipping any dependency jars to disk is cached from run-to-run. This feature can be disabled by setting:
Expand Down
56 changes: 37 additions & 19 deletions src/main/scala/sbtassembly/Plugin.scala
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ object Plugin extends sbt.Plugin {
lazy val packageDependency = TaskKey[File]("assembly-package-dependency", "Produces the dependency artifact.")

lazy val assembleArtifact = SettingKey[Boolean]("assembly-assemble-artifact", "Enables (true) or disables (false) assembling an artifact.")
lazy val appendContentHash = SettingKey[Boolean]("assembly-append-content-hash", "Enables (true) or disables (false) adding SHA-1 to final artifact's name.")
lazy val assemblyOption = SettingKey[AssemblyOption]("assembly-option")
lazy val jarName = TaskKey[String]("assembly-jar-name")
lazy val defaultJarName = TaskKey[String]("assembly-default-jar-name")
Expand Down Expand Up @@ -153,12 +154,14 @@ object Plugin extends sbt.Plugin {
}

private def assemblyTask(out: File, po: Seq[PackageOption], mappings: File => Seq[MappingSet],
strats: String => MergeStrategy, tempDir: File, cacheOutput: Boolean, cacheDir: File, cacheUnzip: Boolean, log: Logger): File =
Assembly(out, po, mappings, strats, tempDir, cacheOutput, cacheDir, cacheUnzip, log)
strats: String => MergeStrategy, tempDir: File, cacheOutput: Boolean, cacheDir: File,
cacheUnzip: Boolean, appendContentHash: Boolean, log: Logger): File =
Assembly(out, po, mappings, strats, tempDir, cacheOutput, cacheDir, cacheUnzip, appendContentHash, log)

object Assembly {
def apply(out: File, po: Seq[PackageOption], mappings: File => Seq[MappingSet],
strats: String => MergeStrategy, tempDir: File, cacheOutput: Boolean, cacheDir: File, cacheUnzip: Boolean, log: Logger): File = {
strats: String => MergeStrategy, tempDir: File, cacheOutput: Boolean,
cacheDir: File, cacheUnzip: Boolean, appendContentHash: Boolean, log: Logger): File = {
import Tracked.{inputChanged, outputChanged}
import Types.:+:
import Cache._
Expand All @@ -169,28 +172,36 @@ object Plugin extends sbt.Plugin {

val mappingSets = mappings(tempDir)
val ms : Seq[(File, String)] = applyStrategies(mappingSets, strats, tempDir, log)
def makeJar {
val config = new Package.Configuration(ms, out, po)
def makeJar(outPath: File) {
val config = new Package.Configuration(ms, outPath, po)
Package(config, cacheDir, log)
}
lazy val inputs = sha1.digest((mappingSets flatMap { _.dependencyFiles } map {hash.apply}).toString.getBytes("UTF-8")).toSeq
val outPath = if (appendContentHash) doAppendContentHash(inputs, out, log) else out

val cachedMakeJar = inputChanged(cacheDir / "assembly-inputs") { (inChanged, inputs: Seq[Byte]) =>
outputChanged(cacheDir / "assembly-outputs") { (outChanged, jar: PlainFileInfo) =>
if (inChanged) {
log.info("SHA-1: " + inputs.map( b => "%02x".format(b) ).mkString)
} // if
if (inChanged || outChanged) makeJar
if (inChanged || outChanged) makeJar(outPath)
else log.info("Assembly up to date: " + jar.file)
}
}

lazy val inputs = sha1.digest((mappingSets flatMap { _.dependencyFiles } map {hash.apply}).toString.getBytes("UTF-8")).toSeq
if (cacheOutput) {
log.info("Checking every *.class/*.jar file's SHA-1.")
cachedMakeJar(inputs)(() => exists(out))
}
else makeJar
out
else makeJar(outPath)
outPath
}

private def doAppendContentHash(inputs: Seq[Byte], initialOutPath: File, log: Logger) = {
val fullSha1 = inputs.map( b => "%02x".format(b) ).mkString
val newName = initialOutPath.getName.replaceAll("\\.[^.]*$", "") + "-" + fullSha1 + ".jar"
new File(newName)
}

def applyStrategies(srcSets: Seq[MappingSet], strats: String => MergeStrategy,
tempDir: File, log: Logger): Seq[(File, String)] = {
val srcs = srcSets.flatMap( _.mappings )
Expand Down Expand Up @@ -279,7 +290,6 @@ object Plugin extends sbt.Plugin {

val jarDirs = for(jar <- libsFiltered.par) yield {
val jarName = jar.asFile.getName

val hash = sha1name(jar) + "_" + sha1content(jar)
val jarNamePath = tempDir / (hash + ".jarName")
val dest = tempDir / hash
Expand Down Expand Up @@ -364,9 +374,10 @@ object Plugin extends sbt.Plugin {
lazy val baseAssemblySettings: Seq[sbt.Project.Setting[_]] = Seq(
assembly <<= (test in assembly, outputPath in assembly, packageOptions in assembly,
assembledMappings in assembly, mergeStrategy in assembly,
assemblyDirectory in assembly, assemblyCacheOutput in assembly, cacheDirectory, assemblyCacheUnzip in assembly, streams) map {
(test, out, po, am, ms, tempDir, co, cacheDir, acu, s) =>
assemblyTask(out, po, am, ms, tempDir, co, cacheDir, acu, s.log) },
assemblyDirectory in assembly, assemblyCacheOutput in assembly, cacheDirectory,
assemblyCacheUnzip in assembly, appendContentHash in assembly, streams) map {
(test, out, po, am, ms, tempDir, co, cacheDir, acu, appendHash, s) =>
assemblyTask(out, po, am, ms, tempDir, co, cacheDir, acu, appendHash, s.log) },

assemblyCacheOutput in assembly := true,

Expand All @@ -380,8 +391,9 @@ object Plugin extends sbt.Plugin {

packageScala <<= (outputPath in packageScala, packageOptions,
assembledMappings in packageScala, mergeStrategy in assembly,
assemblyDirectory in assembly, assemblyCacheOutput in assembly, cacheDirectory, assemblyCacheUnzip in assembly, streams) map {
(out, po, am, ms, tempDir, co, cacheDir, acu, s) => assemblyTask(out, po, am, ms, tempDir, co, cacheDir, acu, s.log) },
assemblyDirectory in assembly, assemblyCacheOutput in assembly,
cacheDirectory, assemblyCacheUnzip in assembly, streams, appendContentHash in packageScala) map {
(out, po, am, ms, tempDir, co, cacheDir, acu, s, appendHash) => assemblyTask(out, po, am, ms, tempDir, co, cacheDir, acu, appendHash, s.log) },

assembledMappings in packageScala <<= (assemblyOption in packageScala, fullClasspath in assembly, dependencyClasspath in assembly,
excludedJars in assembly, assemblyCacheUnzip in assembly, streams) map {
Expand All @@ -390,8 +402,11 @@ object Plugin extends sbt.Plugin {

packageDependency <<= (outputPath in packageDependency, packageOptions in assembly,
assembledMappings in packageDependency, mergeStrategy in assembly,
assemblyDirectory in assembly, assemblyCacheOutput in assembly, cacheDirectory, assemblyCacheUnzip in assembly, streams) map {
(out, po, am, ms, tempDir, co, cacheDir, acu, s) => assemblyTask(out, po, am, ms, tempDir, co, cacheDir, acu, s.log) },
assemblyDirectory in assembly, assemblyCacheOutput in assembly, cacheDirectory,
assemblyCacheUnzip in assembly, streams, appendContentHash in packageDependency) map {
(out, po, am, ms, tempDir, co, cacheDir, acu, s, appendHash) =>
assemblyTask(out, po, am, ms, tempDir, co, cacheDir, acu, appendHash, s.log)
},

assembledMappings in packageDependency <<= (assemblyOption in packageDependency, fullClasspath in assembly, dependencyClasspath in assembly,
excludedJars in assembly, assemblyCacheUnzip in assembly, streams) map {
Expand Down Expand Up @@ -443,7 +458,10 @@ object Plugin extends sbt.Plugin {
excludedJars in assembly := Nil,
assembleArtifact in packageBin := true,
assembleArtifact in packageScala := true,
assembleArtifact in packageDependency := true
assembleArtifact in packageDependency := true,
appendContentHash in packageDependency := false,
appendContentHash in assembly := false,
appendContentHash in packageScala := false
)

lazy val assemblySettings: Seq[sbt.Project.Setting[_]] = baseAssemblySettings
Expand Down

0 comments on commit 4bccd9f

Please sign in to comment.