如何在SBT.scala项目配置中从多个非托管目录添加JAR

如何在SBT.scala项目配置中从多个非托管目录添加JAR,scala,dependencies,project,sbt,unmanagedresources,Scala,Dependencies,Project,Sbt,Unmanagedresources,我正试图让SBT构建一个可能有多个非托管目录的项目。如果我只有一个目录,我可以很容易地这样做: unmanagedBase := file( "custom-libs" ).getAbsoluteFile 但是,由于我有两个带有非托管JAR的目录,所以我需要能够将它们全部添加。我找到了一些信息,但对于完整的.scala文件构建似乎仍然没有用处 我创建了一个简单的项目来说明这个问题。下面是我的Build.scala文件 更新 我从表单中获得了一些帮助,并且能够正确地定义非托管JAR,但是代码仍然

我正试图让SBT构建一个可能有多个非托管目录的项目。如果我只有一个目录,我可以很容易地这样做:

unmanagedBase := file( "custom-libs" ).getAbsoluteFile
但是,由于我有两个带有非托管JAR的目录,所以我需要能够将它们全部添加。我找到了一些信息,但对于完整的.scala文件构建似乎仍然没有用处

我创建了一个简单的项目来说明这个问题。下面是我的Build.scala文件

更新

我从表单中获得了一些帮助,并且能够正确地定义非托管JAR,但是代码仍然无法编译(但是sbt show unmanaged jars正确地显示了文件)


我只是使用sbt0.11.x发布了
build.sbt
文件中的片段。它可能会被重构一点

unmanagedJars in Compile <++= baseDirectory map { base =>
    val libs = base / "lib"
    val dirs = (libs / "batik") +++ (libs / "libtw") +++ (libs / "kiama")
    (dirs ** "*.jar").classpath
}
Compile中的unmanagedJars
val libs=base/“lib”
val dirs=(libs/“batik”)+++(libs/“libtw”)+++(libs/“kiama”)
(dirs**“*.jar”).classpath
}

您可以向文件夹列表添加其他路径,以扫描非托管依赖项。例如,要在名为“config”的文件夹中查找
run
任务的“lib”,您可以添加以下内容。对于
编译
任务,将
运行时
更改为
编译

unmanagedClasspath in Runtime <+= (baseDirectory) map {
  bd => Attributed.blank(bd / "config")
}
unmanagedClasspath在运行时属性为.blank(bd/“config”)
}
正如所回答的,是什么让它作为以下代码工作的:

import sbt._
import com.github.siasia._
import PluginKeys._
import Keys._

object Build extends sbt.Build {

  import Dependencies._

  var unmanagedListing = unmanagedJars in Compile :=  {
    Dependencies.listUnmanaged( file(".").getAbsoluteFile )
  }

  lazy val myProject = Project("spray-template", file("."))
    .settings(WebPlugin.webSettings: _*)
    .settings(port in config("container")  := 8080)
    .settings(
      organization  := "com.example",
      version       := "0.9.0-RC1",
      scalaVersion  := "2.9.1",
      scalacOptions := Seq("-deprecation", "-encoding", "utf8"),
      resolvers     ++= Dependencies.resolutionRepos,
      libraryDependencies ++= Seq(
        C.akkaActor,
        C.sprayServer,
        Test.specs2,
        Container.jettyWebApp,
        Container.akkaSlf4j,
        Container.slf4j,
        Container.logback
      ),
      unmanagedListing
    )

}

object Dependencies {
  val resolutionRepos = Seq(
    ScalaToolsSnapshots,
    "Typesafe repo" at "http://repo.typesafe.com/typesafe/releases/",
    "spray repo" at "http://repo.spray.cc/"
  )

  def listUnmanaged( base : RichFile ) : Keys.Classpath = {
    val baseDirectories = (base / "custom-libs") +++ ( base / "custom-libs2" )
    (baseDirectories ** "*.jar").classpath
  }

  object V {
    val akka    = "1.3"
    val spray   = "0.9.0-RC1"
    val specs2  = "1.7.1"
    val jetty   = "8.1.0.v20120127"
    val slf4j   = "1.6.4"
    val logback = "1.0.0"
  }

  object C {
    val akkaActor   = "se.scalablesolutions.akka" %  "akka-actor"      % V.akka    % "compile"
    val sprayServer = "cc.spray"                  %  "spray-server"    % V.spray   % "compile"
  }

  object Test {
    val specs2      = "org.specs2"                %% "specs2"          % V.specs2  % "test"
  }

  object Container {
    val jettyWebApp = "org.eclipse.jetty"         %  "jetty-webapp"    % V.jetty   % "container"
    val akkaSlf4j   = "se.scalablesolutions.akka" %  "akka-slf4j"      % V.akka
    val slf4j       = "org.slf4j"                 %  "slf4j-api"       % V.slf4j
    val logback     = "ch.qos.logback"            %  "logback-classic" % V.logback
  }
}

源代码repo和完整示例。

这里有一个递归加载非托管jar(对于sbt 0.13.x)的通用解决方案:

我没有build.sbt文件,我是否将其放在build.scala文件中?@MaurícioLinhares您是否尝试过将这些行添加到
build.scala
文件中?@MaurícioLinhares您修改了我的代码?它用于目录
lib/batik
lib/libtw
lib/kiama
。我当然有。在其上添加打印显示它从未被调用,就像上面我自己的代码一样,因此它没有覆盖unmanagedJars任务。可能问题在于您实际上是在用
构建中的第一行覆盖
unmanagedJars
。你试过只使用我的代码而不去摆弄
非托管程序吗?没有用。这里有一个显示该问题的示例项目->-非常感谢您的帮助。
import sbt._
import com.github.siasia._
import PluginKeys._
import Keys._

object Build extends sbt.Build {

  import Dependencies._

  var unmanagedListing = unmanagedJars in Compile :=  {
    Dependencies.listUnmanaged( file(".").getAbsoluteFile )
  }

  lazy val myProject = Project("spray-template", file("."))
    .settings(WebPlugin.webSettings: _*)
    .settings(port in config("container")  := 8080)
    .settings(
      organization  := "com.example",
      version       := "0.9.0-RC1",
      scalaVersion  := "2.9.1",
      scalacOptions := Seq("-deprecation", "-encoding", "utf8"),
      resolvers     ++= Dependencies.resolutionRepos,
      libraryDependencies ++= Seq(
        C.akkaActor,
        C.sprayServer,
        Test.specs2,
        Container.jettyWebApp,
        Container.akkaSlf4j,
        Container.slf4j,
        Container.logback
      ),
      unmanagedListing
    )

}

object Dependencies {
  val resolutionRepos = Seq(
    ScalaToolsSnapshots,
    "Typesafe repo" at "http://repo.typesafe.com/typesafe/releases/",
    "spray repo" at "http://repo.spray.cc/"
  )

  def listUnmanaged( base : RichFile ) : Keys.Classpath = {
    val baseDirectories = (base / "custom-libs") +++ ( base / "custom-libs2" )
    (baseDirectories ** "*.jar").classpath
  }

  object V {
    val akka    = "1.3"
    val spray   = "0.9.0-RC1"
    val specs2  = "1.7.1"
    val jetty   = "8.1.0.v20120127"
    val slf4j   = "1.6.4"
    val logback = "1.0.0"
  }

  object C {
    val akkaActor   = "se.scalablesolutions.akka" %  "akka-actor"      % V.akka    % "compile"
    val sprayServer = "cc.spray"                  %  "spray-server"    % V.spray   % "compile"
  }

  object Test {
    val specs2      = "org.specs2"                %% "specs2"          % V.specs2  % "test"
  }

  object Container {
    val jettyWebApp = "org.eclipse.jetty"         %  "jetty-webapp"    % V.jetty   % "container"
    val akkaSlf4j   = "se.scalablesolutions.akka" %  "akka-slf4j"      % V.akka
    val slf4j       = "org.slf4j"                 %  "slf4j-api"       % V.slf4j
    val logback     = "ch.qos.logback"            %  "logback-classic" % V.logback
  }
}