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