Comment obtenir la propriété maven project.version dans une application Spring Boot avec une annotation @Value?
Après quelques recherches et essais sur la manière d'obtenir la version du projet maven dans une application Spring Boot, je n'ai rien trouvé qui fonctionne pour moi.
L’utilisation d’un manifeste est définitivement un chemin pourri en raison de problèmes de chargement de classe, c’est-à-dire que l’on obtient les premières découvertes de printemps du manifeste, qui dans mon cas n’était pas celle de mon application.
Une solution que j'ai trouvée consiste à utiliser le plug-in maven resources pour "filtrer" (remplacer) les propriétés dans les fichiers de ressources. Dans ce cas, le printemps application.properties
.
Voici les étapes pour faire ce travail.
Dans le pom, activez le filtrage des ressources avec la définition suivante:
<resources>
<resource>
<filtering>true</filtering>
<directory>src/main/resources</directory>
<includes>
<include>application.properties</include>
</includes>
</resource>
</resources>
Dans le application.properties
fichier:
[email protected]@
[email protected]@
build.timestamp=@timestamp@
Notez la @ propriété @ au lieu de $ {propriété}. dans le application.properties
fichier.
Le pom print-boot-starter-parent-pom redéfinit le délimiteur standard $ {} en tant que @:
<resource.delimiter>@</resource.delimiter> <!-- delimiter that doesn't clash with Spring ${} placeholders -->
<delimiters>
<delimiter>${resource.delimiter}</delimiter>
</delimiters>
On peut ensuite accéder à ces propriétés dans Spring en utilisant @Value comme ceci:
@Value("${application.name}")
private String applicationName;
@Value("${build.version}")
private String buildVersion;
@Value("${build.timestamp}")
private String buildTimestamp;
Pour avoir accès aux propriétés Maven dans Application Spring Boot nous avons seulement besoin de les mapper avec le délimiteur @
dans le application.properties
comme ça:
[email protected]@
[email protected]@
Ensuite, utilisez-les dans l'application comme des propriétés ordinaires, par exemple:
@Service
public class SomeService {
@Value("${app.version}")
private String appVersion;
// other stuff
}
Source: Expansion automatique de propriétés à l'aide de Maven
Mais si nous utilisons yaml pour stocker les propriétés de l'application, nous devons remplacer le délimiteur @
avec un autre, par exemple ^
dans notre pom.xml
:
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.7</version>
<configuration>
<delimiters>
<delimiter>^</delimiter>
</delimiters>
<useDefaultDelimiters>false</useDefaultDelimiters>
</configuration>
</plugin>
Ou encore plus simple - remplacez simplement la variable resource.delimiter
dans propeties
bloc de votre pom.xml:
<properties>
<Java.version>11</Java.version>
<resource.delimiter>^</resource.delimiter>
</properties>
Puis utilisez-le dans application.yml
:
app:
version: ^project.version^
name: ^project.name^
Pour cela, il n’est pas nécessaire d’ajouter application.properties ou les modifications du délimiteur. Ajoutez simplement un plugin avec l'objectif build-info et la classe de démarrage Autowire avec le bean BuildProperties.
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.1.3.RELEASE</version>
<executions>
<execution>
<goals>
<goal>build-info</goal>
</goals>
</execution>
</executions>
</plugin>
La classe de démarrage aura
@Autowired
BuildProperties buildProperties;
plus tard dans @PostConstruct, vous pouvez appeler plusieurs méthodes pour récupérer l'horodatage de construction, la version, le nom, l'artefact, etc.
buildProperties.getName();
buildProperties.getVersion();
buildProperties.get("time");
L'actionneur info
l'utilisera automatiquement et l'affichera s'il le détecte, ainsi que informations git s'il en trouve.
C'est probablement parce que votre pom principal ne déclare pas spring-boot-starter-parent comme son pom parent. Parce que dans ce cas, le filtrage est effectué par défaut, sans avoir à déclarer explicitement le filtrage
Pour moi changer de:
<parent>
<groupId>com.mycompany</groupId>
<artifactId>mycompany-parent</artifactId>
<version>20</version>
</parent>
à :
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.6.RELEASE</version>
</parent>
Dans mon application principale, pom.xml corrigeait le problème sans avoir à déclarer le filtrage.