我想在我的gradle项目中过滤特定的java资源。如果某些文件只应替换内容,则还应重命名一些文件(并替换不同的内容)。
我的gradle java项目设置是:
> cat build.gradle
apply plugin: 'java'
sourceSets {
main {
java {
resources {
srcDirs = [ "foo" ]
include '**/**'
}
}
}
}
processResources {
include '**/file_a.txt'
filter { String line ->
line
.replace("foo", "fool" )
}
}
processResources {
include '**/file_b.txt'
rename { "file_c.txt" }
filter { String line ->
line
.replace("ipsum", "zzz" )
}
}
> cat foo/file_a.txt
my name is foo
test ipsum
> cat foo/file_b.txt
lorem ipsum ...
运行后:
gradle build
我明白了:
> ls build/resources/main
file_c.txt
> cat build/resources/main/file_c.txt
my name is fool
test zzz
但是我想要获取这两个文件,其中只有file_b.txt
将被重命名,并且两者都将被特定规则替换。实现这一目标的正确方法是什么?
答案 0 :(得分:5)
好的,我自己找到了解决方案,以下似乎按预期工作:
apply plugin: 'java'
sourceSets {
main {
java {
resources {
srcDirs = [ "foo" ]
include '**/**'
exclude '**/*.txt'
}
}
}
}
processResources {
with copySpec {
from 'foo/file_a.txt'
filter { String line ->
line
.replace("foo", "fool" )
}
}
with copySpec {
from 'foo/file_b.txt'
rename { "file_c.txt" }
filter { String line ->
line
.replace("ipsum", "zzz" )
}
}
}
答案 1 :(得分:1)
我个人认为资源和过滤后的资源应该分开。即src/main/resources
和src/main/filteredResources
。我也应该避免排除(例如exclude '**/*.txt'
)resources
和filteredResources
目录应该只包含最终会出现在jar中的东西......没什么用的
import org.apache.tools.ant.filters.ReplaceTokens
processResources {
with copySpec {
from 'src/main/filteredResources'
filter(ReplaceTokens, tokens: [foo: 'fool', ipsum: 'zzz'])
}
}
以上代码段将替换@foo@
文件夹中所有文件中的@ipsum@
和src/main/filteredResources