我正在尝试设置SBT来编译一个不使用maven目录结构的现有项目。我正在使用full configuration并设置了我的javaSource& resourceDirectory设置如下:
def settings = Defaults.defaultSettings ++ Seq(
resourceDirectory in Compile <<= baseDirectory( _ / "java" ),
javaSource in Compile <<= baseDirectory( _ / "java" )
)
现在我希望能够过滤我们在jar工件中包含的资源,就像我们目前使用ant一样,加上排除.java文件,因为我们的资源与源代码混合在一起。例如:
<fileset dir="java" includes="**/*.txt, **/*.csv" excludes="**/*.java" />
有没有办法做到这一点?
答案 0 :(得分:6)
对defaultExcludes
任务使用unmanagedResources
作用域,并可选择使用配置。例如,此设置从主要资源中排除.java文件:
defaultExcludes in Compile in unmanagedResources := "*.java"
in Compile
将此设置限制为仅适用于主要资源。通过使用in Test
代替它,它仅适用于测试资源。通过省略配置(即,没有in Compile
或in Test
),该设置将适用于主资源和测试资源。
in unmanagedResources
仅对资源应用这些排除。例如,要将排除应用于源,范围将为in unmanagedSources
。非托管部分的原因是要强调这些仅适用于非托管(或手动编辑)的源。
defaultExcludes
键的类型为sbt.FileFilter,因此设置值必须为此类型。在上面的示例中,"*.java"
被隐式转换为FileFilter。 *
被解释为通配符,因此过滤器接受名称以“.java”结尾的文件。要合并过滤条件,请使用||
和&&
。例如,如果还需要排除.scala文件,:=
的参数将为:
"*.java" || "*.scala"
在原始Ant文件集中,include和exclude过滤器选择互斥的文件集,因此只需要一个。
也可以直接为Seq[File]
构建unmanagedResources
。例如:
unmanagedResources in Compile <<=
unmanagedResourceDirectories in Compile map { (dirs: Seq[File]) =>
( dirs ** ("*.txt" || "*.csv" -- "*.java") ).get
}
**
方法选择与FileFilter
参数匹配的所有后代。您可以通过运行show unmanaged-resources
来验证是否按预期选择了文件。