Se si desidera estrarre un insieme di dipendenze gestite, il codice riportato di seguito dovrebbe funzionare. L'ho testato in SBT 0.12.0, ma dovrebbe funzionare anche con 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: _*)
}
Se si dispone semplicemente di file jar da estrarre, è possibile aggiungerli come dipendenze non gestite, ad es. inserendoli nella cartella/lib. Vedi: https://github.com/harrah/xsbt/wiki/Getting-Started-Library-Dependencies
Se davvero avete file zip (o desidera estrarre le dipendenze non gestiti), è possibile modificare il codice qui sopra per elencarli:
// list jar files to be extracted
jarsToExtract <<= (baseDirectory) map { dir => Seq(dir/"lib"/"newrelic-api-2.2.1.zip") },
Ora dovrebbe essere in grado di estrarre manualmente da SBT e dovrebbero automaticamente essere estratti prima della compilazione:
> 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
Ora è possibile aggiungere una nuova attività o ampliare quello esistente che estrae il file zip dalla dipendenza estratto. Se non è necessario il contenuto della dipendenza, è possibile utilizzare l'impostazione di task-temporanea-directory che ti dà una directory temporanea scrivibile da SBT:
// define the target directory
extractJarsTarget <<= taskTemporaryDirectory,
Qualsiasi fortuna risolvere questo? – Arjan
Non ancora. Finora sto ancora usando la versione ANT per farlo –
Per la seconda parte riguardante l'aggancio dell'operazione di decompressione dovresti controllare il wiki delle attività https://github.com/harrah/xsbt/wiki/Tasks. Cercare come dichiararli e quindi stabilire le dipendenze in modo che si inneschino durante la costruzione o l'imballaggio. –