web-dev-qa-db-fra.com

Impossible d'obtenir la propriété project.version maven dans une application Spring avec @Value

Comment obtenir la propriété maven project.version dans une application Spring Boot avec une annotation @Value?

34
Jack G.

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;

n exemple de projet est disponible ici .

67
Jack G.

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^
21
Cepr0

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.

6
Milan Desai

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.

1
TheBakker