Unpacking an artifact using SBT

As part of my project build, I would like to unzip the managed dependency zip artifact into a specific project directory. Before starting to use SBT, I did this with an ANT script that would extract the zip artifact from the maven dependency and unzip it.

My question (s):

  • How to specify that I want to depend on zip dependencies? I defined it like this: "eu.delving" % "sip-creator" % "0.4.6-SNAPSHOT" but this does not lead to a zip artifact
  • where / how to connect to the build process to start unpacking (and how to refer to the artifact file in this context)?
+5
source share
1 answer

, . sbt 0.12.0, 0.11.x.

import sbt._
import Keys._
import Classpaths.managedJars

object TestBuild extends Build {

    lazy val jarsToExtract = TaskKey[Seq[File]]("jars-to-extract", "JAR files to be extracted")

    lazy val extractJarsTarget = SettingKey[File]("extract-jars-target", "Target directory for extracted JAR files")

    lazy val extractJars = TaskKey[Unit]("extract-jars", "Extracts JAR files")

    lazy val testSettings = Defaults.defaultSettings ++ Seq(
        // define dependencies
        libraryDependencies ++= Seq(
            "com.newrelic" % "newrelic-api" % "2.2.1"
        ),

        // collect jar files to be extracted from managed jar dependencies
        jarsToExtract <<= (classpathTypes, update) map { (ct, up) =>
            managedJars(Compile, ct, up) map { _.data } filter { _.getName.startsWith("newrelic-api") }
        },

        // define the target directory
        extractJarsTarget <<= (baseDirectory)(_ / "extracted"),

        // task to extract jar files
        extractJars <<= (jarsToExtract, extractJarsTarget, streams) map { (jars, target, streams) =>
            jars foreach { jar =>
                streams.log.info("Extracting " + jar.getName + " to " + target)
                IO.unzip(jar, target)
            }
        },

        // make it run before compile
        compile in Compile <<= extractJars map { _ => sbt.inc.Analysis.Empty }
    )

    lazy val test: Project = Project("test", file(".")) settings (testSettings: _*)
}

jar , , .. /lib. .: https://github.com/harrah/xsbt/wiki/Getting-Started-Library-Dependencies

zip ( ), , :

// list jar files to be extracted
jarsToExtract <<= (baseDirectory) map { dir => Seq(dir / "lib" / "newrelic-api-2.2.1.zip") },

sbt, :

> clean
[success] Total time: 0 s, completed Oct 12, 2012 5:39:16 PM
> extract-jars
[info] Extracting newrelic-api-2.2.1.zip to /Users/balagez/Sites/test/extracted
[success] Total time: 0 s, completed Oct 12, 2012 5:39:22 PM
> compile
[info] Extracting newrelic-api-2.2.1.zip to /Users/balagez/Sites/test/extracted
[success] Total time: 0 s, completed Oct 12, 2012 5:39:24 PM

, zip . , task-tempor-directory, , sbt:

// define the target directory
extractJarsTarget <<= taskTemporaryDirectory,
+6

All Articles