Nếu bạn muốn trích xuất một tập hợp các phụ thuộc được quản lý, mã bên dưới sẽ hoạt động. Tôi đã thử nghiệm nó trong sbt 0.12.0, nhưng nó cũng nên làm việc với 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: _*)
}
Nếu bạn chỉ cần có tệp jar để trích xuất, bạn có thể thêm chúng dưới dạng phụ thuộc không được quản lý, tức là. đưa chúng vào thư mục/lib. Xem: https://github.com/harrah/xsbt/wiki/Getting-Started-Library-Dependencies
Nếu bạn thực sự có file zip (hoặc muốn trích xuất các phụ thuộc không được quản lý), bạn có thể thay đổi mã ở trên để liệt kê chúng:
// list jar files to be extracted
jarsToExtract <<= (baseDirectory) map { dir => Seq(dir/"lib"/"newrelic-api-2.2.1.zip") },
Bây giờ bạn sẽ có thể tự giải nén chúng từ sbt và chúng sẽ tự động được trích xuất trước khi biên dịch:
> 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
Bây giờ bạn có thể thêm một tác vụ mới hoặc mở rộng tác vụ hiện có để trích xuất tệp nén từ phụ thuộc được trích xuất. Nếu bạn không cần nội dung của sự phụ thuộc, bạn có thể sử dụng các thiết lập nhiệm vụ tạm thời thư mục mang đến cho bạn một ghi thư mục tạm thời bởi SBT:
// define the target directory
extractJarsTarget <<= taskTemporaryDirectory,
Bất kỳ may mắn giải quyết này? – Arjan
Chưa. Cho đến nay tôi vẫn đang sử dụng phiên bản ANT của nó để làm như vậy –
Đối với phần thứ hai liên quan đến việc hooking hành động giải nén, bạn nên kiểm tra các nhiệm vụ wiki https://github.com/harrah/xsbt/wiki/Tasks. Tra cứu cách khai báo và sau đó thiết lập các phụ thuộc để nó kích hoạt khi xây dựng hoặc đóng gói. –