After some research and trials on how to get the Maven project version in a SpringBoot application I couldn't find anything working for me.
Using a manifest is definitively a rotten path due to class loaders issues, i.e. one gets the first manifest Spring finds, which in my case was not the one of my application.
One solution I have found is to use the maven resources plugin to "filter" (replace) properties in resource files. In this case the Spring application.properties
.
Below are the steps to make this work.
In the pom file, activate resources filtering with the following definition:
<resources>
<resource>
<filtering>true</filtering>
<directory>src/main/resources</directory>
<includes>
<include>application.properties</include>
</includes>
</resource>
</resources>
In the application.properties
file:
[email protected]@
[email protected]@
build.timestamp=@timestamp@
Notice the @property@ instead of ${property}. in the application.properties
file.
The spring-boot-starter-parent
pom redefines the standard ${}
delimiter as @
:
<resource.delimiter>@</resource.delimiter>
<!-- delimiter that doesn't clash with Spring ${} placeholders -->
<delimiters>
<delimiter>${resource.delimiter}</delimiter>
</delimiters>
One can then access those properties in Spring using @Value
like this:
@Value("${application.name}")
private String applicationName;
@Value("${build.version}")
private String buildVersion;
@Value("${build.timestamp}")
private String buildTimestamp;
A sample project is available here.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…