spring 如何将时间戳属性从build.gradle传递到application.properties?

bxgwgixi  于 2023-08-02  发布在  Spring
关注(0)|答案(2)|浏览(141)

我在build.gradle中定义了一个timestamp值,如下所示

build.gradle

  1. def timestamp = new Date().format('yyyyMMddHHmm')
  2. println "Timestamp:" + timestamp
  3. springBoot {
  4. mainClass = 'com.example.login.Application'
  5. buildInfo {
  6. properties {
  7. additionalProperties = [
  8. 'timestamp': "${timestamp}"
  9. ]
  10. }
  11. }
  12. }
  13. .
  14. .
  15. .

字符串
现在我的build/resources/main/META-INF中的build-info.properties看起来像这样,

  1. build.artifact=login
  2. build.group=com.example
  3. build.name=login
  4. build.timestamp=202307111234

应用.属性

  1. current.timestamp=@timestamp@


我尝试从AppFilter.java类的build-info属性中检索build.time,如下所示

  1. public class AppFilter {
  2. @Autowired
  3. private BuildProperties buildProperties;
  4. public AppFilter() {
  5. }
  6. public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
  7. String timestamp = buildProperties.get("build.timestamp");
  8. System.out.println("Timestamp=>"+timestamp);
  9. .
  10. .
  11. .
  12. }
  13. }


有没有一种方法可以将timestamp属性从build.gradle传递到application.properties,以便当前的.timestamp将具有来自我的gradle构建的timestamp值?
得到以下错误,

调试后出错

  1. String timestamp = buildProperties[NullPointerException]....


我是新手。任何帮助都是感激的。
谢了,谢了

smdncfj3

smdncfj31#

以下是如何使用自己的replace来执行此操作:

  • build.gradle.kts*
  1. import org.apache.tools.ant.filters.ReplaceTokens
  2. tasks.named<ProcessResources>("processResources") {
  3. filesMatching("application.properties") {
  4. filter(ReplaceTokens::class, "tokens" to mapOf("current.timestamp" to "abc"))
  5. }
  6. }

字符串
我相信Groovy会是这样的:

  • build.gradle*
  1. import org.apache.tools.ant.filters.ReplaceTokens
  2. tasks.named("processResources", ProcessResources) {
  3. filesMatching("application.properties") {
  4. filter(ReplaceTokens, tokens: ["current.timestamp": "abc"])
  5. }
  6. }


因此,我建议使用Sping Boot 构建信息:
https://docs.spring.io/spring-boot/docs/current/gradle-plugin/reference/htmlsingle/#integrating-with-actuator.build-info
完成后,您可以注入BuildProperties bean以获取其值:
https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/info/BuildProperties.html

  • 工作示例:*
  • build.gradle.kts*
  1. plugins {
  2. `java-library`
  3. id("org.springframework.boot") version "3.1.+"
  4. id("io.spring.dependency-management") version "1.1.0"
  5. }
  6. springBoot {
  7. buildInfo {
  8. properties {
  9. additional.set(mapOf("timestamp" to "Timestamp: ${Date()}"))
  10. }
  11. }
  12. }

  • 测试 *
  1. @SpringBootTest
  2. public class BuildInfoTest {
  3. @Autowired
  4. BuildProperties buildProperties;
  5. @Test
  6. void foo() {
  7. System.out.println("====================================");
  8. System.out.println(buildProperties.getName());
  9. System.out.println(buildProperties.getTime());
  10. System.out.println(buildProperties.get("timestamp"));
  11. System.out.println("====================================");
  12. }
  13. }

  • 输出:*
  1. ====================================
  2. my-project
  3. 2023-07-11T19:55:18.473Z
  4. Timestamp: Tue Jul 11 15:55:18 EDT 2023
  5. ====================================

展开查看全部
t40tm48m

t40tm48m2#

将CopySpec更改为expand(timestamp: timestamp)并将属性文件更改为current.timestamp=$timestamp
传递给expand()的Map中的键应该是您要替换的令牌。
@timestamp@样式的令牌与ReplaceTokens过滤器一起使用,如果您愿意,也可以使用它。详情请参见https://docs.gradle.org/current/userguide/working_with_files.html#sec:filtering_files。

相关问题