springboot编译任务里有关资源抽取的实现逻辑
资源抽取是指对类似*.properties等属性配置资源文件的提取,springboot团队对springboot源码的资源提取机制做了专门的实现。
springboot编译任务对资源抽取的实现逻辑:
public class ExtractResources extends DefaultTask {
/** 定义一个占位符助手:前后缀分别为${、} */
private final PropertyPlaceholderHelper propertyPlaceholderHelper = new PropertyPlaceholderHelper("${", "}");
private final Map properties = new HashMap<>();
private final DirectoryProperty destinationDirectory;
private List resourceNames = new ArrayList<>();
/**
* 默认构造器,初始化目标目录为当前项目名
*/
public ExtractResources() {
this.destinationDirectory = getProject().getObjects().directoryProperty();
}
@Input
public List getResourceNames() {
return this.resourceNames;
}
public void setResourcesNames(List resourceNames) {
this.resourceNames = resourceNames;
}
@OutputDirectory
public DirectoryProperty getDestinationDirectory() {
return this.destinationDirectory;
}
public void property(String name, String value) {
this.properties.put(name, value);
}
@Input
public Map getProperties() {
return this.properties;
}
/**
* 资源提取
* @throws IOException
*/
@TaskAction
void extractResources() throws IOException {
// 遍历资源文件
for (String resourceName : this.resourceNames) {
InputStream resourceStream = getClass().getClassLoader().getResourceAsStream(resourceName);
if (resourceStream == null) {
throw new GradleException("Resource '" + resourceName + "' does not exist");
}
// 把资源文件的内容读取到字符串中
String resource = FileCopyUtils.copyToString(new InputStreamReader(resourceStream, StandardCharsets.UTF_8));
// 按指定的前后缀找到文本内容中的占位符,然后取出占位符中确定的属性key,再从指定的properties里取出对应的value去替换原来的占位符,
// 最后返回替换后的文本配置
resource = this.propertyPlaceholderHelper.replacePlaceholders(resource,
(placeholder) -> this.properties.get(placeholder));
// 将返回的文本配置重写回到目标目录下的文件中
FileCopyUtils.copy(resource,
new FileWriter(this.destinationDirectory.file(resourceName).get().getAsFile()));
}
}
}
声明: 除非转自他站(如有侵权,请联系处理)外,本文采用 BY-NC-SA 协议进行授权 | 嗅谱网
转载请注明:转自《springboot编译任务里有关资源抽取的实现逻辑》
本文地址:http://www.xiupu.net/archives-10635.html
关注公众号:
微信赞赏
支付宝赞赏
