maven - 我正在将 Maven WAR 构建迁移到 Gradle。如何让过滤器块以相同的方式运行?
问题描述
我正在将构建从 Maven 转换为 Gradle,并在其中进行一些资源过滤。具体来说,我们有一个如下所示的块:
<build>
<finalName>${project.name}-${project.version}</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<testResources>
<testResource>
<directory>src/test/resources</directory>
<filtering>true</filtering>
</testResource>
</testResources>
<filters>
<filter>/path/to/more/resources.properties</filter>
<filter>/path/to/more/resources.properties</filter>
<filter>/path/to/more/resources.properties</filter>
</filters>
</build>
...我们希望在 Gradle 中获得类似的东西。
带有过滤器的复制任务的文档并不完整,也没有描述我正在尝试解决的具体问题:
- 过滤掉特定的资源文件
- 保持使用中的变量的 POM 风格 (
${example.property}
) - 确保工件进入我的 WAR
我该怎么做呢?
解决方案
这是这个面向 Gradle 的答案的扩展,带有一些更具体的示例。
首先,我们需要将我们关心的所有资源读入filter
Copy 任务的方法将识别的内容。按照惯例,这只是一个标准Properties
对象。
这可以像这样完成:
def resources = new Properties()
file($projectDir/src/main/resources/<insert-properties-file>.properties").withInputStream {
resources.load(it)
}
请注意,可能有一种更优雅的方法可以一次获取多个属性文件;这种方法对我来说只适用于单个文件。
接下来,我们需要实际进行过滤。这可以通过from
关闭来实现。我们利用ReplaceTokens 类(我们可以导入)来执行此操作,并配置开始和结束标记以匹配我们的变量使用。
from("$projectDir/path/to/folder/that/has/tokens/to/replace") {
include "**/files-to-filter-on"
filter(ReplaceTokens, tokens: resources, beginToken: "${", endToken: "}")
}
要将其放入 WAR,我们需要将其加载到processResources
任务中。
全部一起:
processResources {
with copySpec {
def resources = new Properties()
file($projectDir/src/main/resources/<insert-properties-file>.properties").withInputStream {
resources.load(it)
}
from("$projectDir/path/to/folder/that/has/tokens/to/replace") {
include "**/files-to-filter-on"
filter(ReplaceTokens, tokens: resources, beginToken: "${", endToken: "}")
}
}
当您执行./gradlew clean war
时,您想要过滤的资源将在存档中正确过滤。
推荐阅读
- sql - 从 Oracle 中的给定字符串中提取特定字符串
- tfs - .net 核心覆盖结果未显示
- makefile - 找不到 libNrrdIO 链接库
- sql-server - 将 AWS RDS SQL Server 存储过程结果复制到 S3 存储桶
- linux - 在子目录中查找不包含文件的主目录名称
- java - 如果输入不是java中的数字,如何检查并显示错误消息
- mongodb - Mongo 错误:“$out 阶段需要一个字符串参数,但找到了对象(代码:14,代码名称:TypeMismatch)”
- javascript - 如何在#css中找到我们想要放置div的点的高度和宽度
- state-machine - 这是 Epsilon-NFA 正确的吗?
- javascript - 从 api 调用的 json 对象中删除重复值