Получить файл ресурса из зависимости в 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 не будет работать.

Другие вопросы по тегам