Spring boot Spring启动执行器有Java API吗?

Spring boot Spring启动执行器有Java API吗?,spring-boot,Spring Boot,我们定制Spring Boot Actuator Info端点,以包括在Jenkins构建期间生成的应用程序版本号。我们使用gradle来实现这一点: if (project.hasProperty('BUILD_NUMBER')) { version = "${BUILD_NUMBER}" } else { version = "0.0.1-SNAPSHOT" } 这对于将版本添加到/info端点非常有用,但我希望在应用程序启动时访问它并将其打印到应用程序日志中 我希望这些值

我们定制Spring Boot Actuator Info端点,以包括在Jenkins构建期间生成的应用程序版本号。我们使用gradle来实现这一点:

if (project.hasProperty('BUILD_NUMBER')) {
    version = "${BUILD_NUMBER}"
} else {
    version = "0.0.1-SNAPSHOT"
}
这对于将版本添加到/info端点非常有用,但我希望在应用程序启动时访问它并将其打印到应用程序日志中

我希望这些值可以在一些属性值中公开(类似于
spring.profiles.active
)或通过JavaAPI公开。这样,我就可以做这样的事情:

    public class MyApplication{

    public static void main(String[] args) throws Exception {
        SpringApplication.run(MyApplication.class, args);

        ConfigurableEnvironment environment = applicationContext.getEnvironment();

System.out.println(environment.getProperty("spring.fancy.path.to.info.version"));
    }
}

通过查看文档,我没有找到一种在代码中轻松访问这些值的方法。其他人是否有幸做到这一点?

要获得与通过REST端点公开的启动器端点完全相同的属性,可以在其中一个类中注入相应端点类的实例。在您的例子中,“正确的”端点类将是。度量、健康等有类似的端点类

SpringBoot1.5.x和SpringBoot2.x之间的接口有一些变化。因此,确切的完全限定类名或读取方法名可能因您使用的Spring引导版本而异。在boot1.5.x中,您可以在
org.springframework.Boot.actuate.endpoint
包中找到大多数端点

大致上,这就是如何构建一个简单的组件来读取您的版本属性(假设info端点中的属性名称只是
build.version
):

@组件
公共类版本接受器{
私有最终信息端点;
@自动连线
公共版本Accessor(InfoEndpoint){
this.endpoint=端点;
}
公共字符串getVersion(){
//弹簧靴2.x
返回字符串.valueOf(getValueFromMap(endpoint.info());
//弹簧靴1.x
返回字符串.valueOf(getValueFromMap(endpoint.invoke());
}
//从终结点返回的信息可能包含嵌套映射
//检索正确值的确切步骤取决于
//确切的属性名称。在这里,我们假设
//对build.version属性感兴趣
私有对象getValueFromMap(地图信息){
return((Map)info.get(“build”).get(“version”);
}
}

上面的版本号是环境变量吗?@IndraneelBende,它是在构建时由Jenkins设置的。Gradle(可能是spring引导插件的一部分)在
boot-INF/classes/META-INF/build-info.properties
中创建了一个包含构建信息的文件。这必须是执行器在运行时提取信息的地方。也许从类路径加载资源是一种方法。似乎应该有一种方法可以通过框架访问它。非常好,谢谢。只有一个小的调整。在v2.x中,info()方法返回一个嵌套映射
build:{version=0.0.1-SNAPSHOT,artifact=my artifact,name=my app,description=my desc,group=ad,time=2018-06-23 13:13:00+0000}
Right,我检查了,这也是1.x的行为(基本上,info端点有几个“贡献者”),每个都返回自己的映射(可以嵌套,也可以不嵌套;构建信息有自己的贡献者)。我会更新答案以反映真相。