Получить файл ресурса из зависимости в sbt
У меня есть проект sbt-web с некоторыми webjar и общими зависимостями jar. Я хочу получить файл ресурсов из одной из моих зависимостей jar и использовать его в задаче конкатенации. Но я не знаю, как обратиться к ресурсу внутри зависимого фляги в моем build.sbt.
3 ответа
Я наконец-то нашел решение с помощью этой документации. Основная идея состоит в том, чтобы найти правильный jar в зависимостях classpath, разархивировать его в временную папку и сделать то, что вам нужно с этими файлами. В моем случае я копирую его в целевой каталог и использую его в задаче конкатенации.
Я в конечном итоге с этим кодом:
def copyResourceFromJar(classpathEntry: Attributed[File], jarName: String, resourceName: String) = {
classpathEntry.get(artifact.key) match {
case Some(entryArtifact) => {
// searching artifact
if (entryArtifact.name.startsWith(jarName)) {
// unpack artifact's jar to tmp directory
val jarFile = classpathEntry.data
IO.withTemporaryDirectory { tmpDir =>
IO.unzip(jarFile, tmpDir)
// copy to project's target directory
// Instead of copying you can do any other stuff here
IO.copyFile(
tmpDir / resourceName,
(WebKeys.webJarsDirectory in Assets).value / resourceName
)
}
}
}
case _ =>
}
}
for(entry <- (dependencyClasspath in Compile).value) yield {
copyResourceFromJar(entry, "firstJar", "firstFile.js")
copyResourceFromJar(entry, "secondJar", "some/path/secondFile.js")
}
Этот код должен быть помещен в задачу. Например:
val copyResourcesFromJar = TaskKey[Unit]("copyResourcesFromJar", "Copy resources from jar dependencies")
copyResourcesFromJar := {
//your task code here
}
copyResourcesFromJar <<= copyResourcesFromJar dependsOn (dependencyClasspath in Compile)
И не забудьте добавить эту задачу как зависимость к вашей задаче сборки. В моем случае это выглядит так:
concat <<= concat dependsOn copyResourcesFromJar
Другие ответы не сработали для меня, я думаю, потому что они относятся к более старым версиям SBT. Я следовал этому методу, и, похоже, он работает на SBT v1.2.8.
Обычно getResourceAsStream работает:
getClass.getResourceAsStream("/path/to/resource/in/jar")
Важно прочитать ресурс, так как Stream getClass.getResource не будет работать.