本页讨论 sbt 如何为不同的操作(如 compile、run 和 test)构建类路径,以及如何覆盖或增强这些类路径。
在 sbt 中,类路径包含 Scala 库以及(当声明为依赖项时)Scala 编译器。与类路径相关的设置和任务通常提供类型为 Classpath 的值。这是 Seq[Attributed[File]] 的别名。 Attributed 是一种类型,它将一个异构映射与每个类路径条目相关联。目前,这允许 sbt 将编译产生的 Analysis 与相应的类路径条目相关联,并且对于托管条目,将定义依赖项的 ModuleID 和 Artifact 与之相关联。
要显式提取原始 Seq[File],请使用隐式添加到 Classpath 的 files 方法
val cp: Classpath = ...
val raw: Seq[File] = cp.files
要从 Seq[File] 创建 Classpath,请使用 classpath,要从 File 创建 Attributed[File],请使用 Attributed.blank
val raw: Seq[File] = ...
val cp: Classpath = raw.classpath
val rawFile: File = ..
val af: Attributed[File] = Attributed.blank(rawFile)
类路径、源代码和资源分为两大类:非托管和托管。非托管文件是手动创建的文件,不受构建控制。它们是构建的输入。托管文件受构建控制。这些文件包括生成的源代码和资源,以及已解析和检索的依赖项以及已编译的类。
生成托管文件的任务应按如下方式插入
Compile / sourceGenerators +=
generate( (Compile / sourceManaged).value / "some_directory")
在此示例中,generate 是类型为 File => Seq[File] 的某个函数,它实际执行工作。因此,我们将一个新任务追加到主源代码生成器列表(Compile / sourceGenerators)中。
要插入命名任务,这是插件的更好方法
val mySourceGenerator = taskKey[Seq[File]](...)
Compile / mySourceGenerator :=
generate( (Compile / sourceManaged).value / "some_directory")
Compile / sourceGenerators += (Compile / mySourceGenerator)
task 方法用于引用实际任务,而不是任务的结果。
对于资源,有类似的键 resourceGenerators 和 resourceManaged。
项目基本目录默认情况下是一个源代码目录,除了 src/main/scala。你可以按名称排除源代码文件(下面示例中的 butler.scala),例如
unmanagedSources / excludeFilter := "butler.scala"
阅读有关 如何在项目文件夹中排除 .scala 源代码文件 - Google Groups 的更多信息
类路径还分为内部和外部依赖项。内部依赖项是项目间依赖项。它们实际上将一个项目的输出放在另一个项目的类路径上。
外部类路径是非托管和托管类路径的并集。
对于类路径,相关的键是
unmanagedClasspath
managedClasspath
externalDependencyClasspath
internalDependencyClasspath
对于源代码
unmanagedSources 这些默认情况下是从 unmanagedSourceDirectories 构建的,它包含 scalaSource 和 javaSource。managedSources 这些是生成的源代码。sources 将 managedSources 和 unmanagedSources 合并在一起。sourceGenerators 这些是生成源代码文件的任务。通常,这些任务会将源代码放在 sourceManaged 提供的目录中。对于资源
unmanagedResources 这些默认情况下是从 unmanagedResourceDirectories 构建的,默认情况下是 resourceDirectory,它排除与 defaultExcludes 匹配的文件。managedResources 默认情况下,对于标准项目,它为空。sbt 插件将在此处有一个生成的描述符文件。resourceGenerators 这些是生成资源文件的任务。通常,这些任务会将资源放在 resourceManaged 提供的目录中。使用 inspect 命令 获取更多详细信息。
另请参阅相关的 StackOverflow 答案。
你有一个独立的项目,它使用一个库,该库在运行时从类路径加载 xxx.properties。你将 xxx.properties 放入目录“config”中。当你运行“sbt run”时,你希望该目录在类路径中。
Runtime / unmanagedClasspath += baseDirectory.value / "config"