4

以前在 Spring Boot 1.x 中,我编写了一个 Gradle 任务来将 jar 的构建版本复制到应用程序的版本中,application.yml并用正则表达式替换给定的属性,例如info.build.version: 0.0.1

迁移到 Spring Boot 2.0,我意识到有io.spring.dependency-management允许我定义buildInfo任务的插件:

springBoot {
    buildInfo()
}

这在访问/info执行器时有效并成功显示了相同的信息。

现在我想在两个用例中使用生成build.version的 in :META-INF/build-info.properties

  1. 在 SwaggerUI 中显示版本
  2. 在每个日志行中包含版本

以前,像这样访问属性就足够了:@Value("${info.build.version:undefined}") String buildVersion 或 in logback-spring.xml

<springProperty scope="context" name="applicationVersion" source="info.build.version"/>

不幸的是,即使我替换info.build.versionbuild.version(正如我所期望的那样),这两个访问器都不再起作用了。

我相信在 logback 中包含版本只是通过注释访问属性的一小步@Value,所以这是我问题的核心:

如何访问生成build.version的 in META-INF/build-info.propertiesthrough @Value

我也尝试添加任务

processResources {
    filesMatching('build-info.properties') {
        expand(project.properties)
    }    
}

正如https://stackoverflow.com/a/42051412/3105453中所建议的那样,但这似乎没有任何效果。

4

3 回答 3

10

说到spring-boot,几乎所有 Spring 处理的信息都可以作为 Spring 管理的 bean 访问。

对于构建信息,spring-boot有一个bean公开的自动装配称为buildProperties. 这通过ProjectInfoAutoConfiguration模块发生。

连同 Spring Expression 语言 ( SpEL) 对@Value注解的支持,您可以获得如下所述的预期结果。

@Value("#{buildProperties.get('version')}")           // not 'build.version'
private String myAppBuildVersion;

或者更好的是,将buildPropertiesbean 直接自动连接到您的组件,以便您可以随意使用它。

@Autowired
private BuildProperties buildProperties;

注意:自动配置会去掉build.前缀。所以你的 SpEL表达应该version用作关键。不是build.version


更新:

我首先对您的问题感到困惑,因为问题更多的是关于如何使用@Value注释。所以我将保留上述答案。

为了帮助您logback-spring.xml,将其build-info.properties导入logback-spring.xml如下所示。这允许使用 build-info.properties 访问每个键logback place-holders。(不要将此与 Spring Property 占位符或 Spring-Expressions 混淆)

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
  <springProperty scope="context" name="appLogTarget" source="app.log.target"
    defaultValue="CONSOLE"/>
  <property resource="META-INF/build-info.properties" />


  <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <layout class="ch.qos.logback.classic.PatternLayout">
      <Pattern>[${build.version}] %d{ISO8601}" %-5p [%c{3}"] \(%t:%X{}"\) %m%n</Pattern>
    </layout>
  </appender>
 <root>
    <level value="DEBUG"/>
    <appender-ref ref="CONSOLE"/>
  </root>
</xml>

tag的"resource"属性将查看并找到合适的那个。<properties/>classpath resources

于 2018-05-05T09:12:07.577 回答
2

您需要将文件添加META-INF/build-info.properties@PropertSourceSpring-Boot-Application:

@SpringBootApplication()
@PropertySource("classpath:META-INF/build-info.properties")
public class MyApp implements WebMvcConfigurer { 
  ...
}

之后,您可以build.version通过@ValueController/Service/...访问该属性

@Controller(...)
public MyController {
    @Value("${build.version}") String myVersion;
    ...
}
于 2018-05-05T08:09:36.027 回答
1

Spring 2.4开始,您可以使用该spring.config.import属性。例如,在application.yml

spring.config.import: "classpath:META-INF/build-info.properties"
...
sentry.version: ${build.version}

同样@Value("${build.version}")也可以工作,或者访问logback-spring.xml.

于 2021-12-15T18:38:13.860 回答