106 votes

Ne peut pas obtenir de projet maven.la version de propriété, au Printemps de l'application avec @Valeur

Comment obtenir le projet maven.la version de propriété, au Printemps de Démarrage de l'application avec un @de la Valeur de l'annotation?

153voto

J. Gonzalez Points 548

Après quelques recherches et essais sur la façon d'obtenir le projet maven version de Printemps de l'application de Démarrage, je ne pouvais pas trouver quelque chose de travailler pour moi.

À l'aide d'un manifeste est définitivement un mauvais chemin à cause de la classe chargeurs de questions, c'est à dire un seul obtient le premier manifeste du Printemps trouve, ce qui dans mon cas n'était pas l'une de mes applications.

Une solution que j'ai trouvé est d'utiliser le maven ressources plugin pour "filter" (remplacer) propriétés dans les fichiers de ressources. Dans ce cas, le Ressort application.properties.

Ci-dessous sont les étapes pour faire ce travail.

Dans le pom, activer des ressources de filtrage avec la définition suivante:

    <resources>
        <resource>
            <filtering>true</filtering>
            <directory>src/main/resources</directory>
            <includes>
                <include>application.properties</include>
            </includes>
        </resource>
    </resources>

Dans l' application.properties le fichier:

  application.name=@project.artifactId@
  build.version=@project.version@
  build.timestamp=@timestamp@

Avis de la @property@ au lieu de ${propriété}. dans l' application.properties le fichier.

Le printemps-amorçage-starter-pom parent redéfinit le standard de ${} délimiteur comme @:

    <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 au Printemps à l'aide de @Valeur comme ceci:

@Value("${application.name}")
private String applicationName;

@Value("${build.version}")
private String buildVersion;

@Value("${build.timestamp}")
private String buildTimestamp;

Un exemple de projet est disponible ici.

81voto

Cepr0 Points 7789

Pour obtenir l'accès à des propriétés Maven dans le Printemps de Démarrage de l'application , tous nous avons besoin est une carte avec séparateur @ dans la application.properties comme ceci:

app.version=@project.version@
app.name=@project.name@

Ensuite les utiliser dans l'application comme d'ordinaire propriétés, par exemple:

@Service
public class SomeService {

   @Value("${app.version}")
   private String appVersion;

   // other stuff
}

Source: Automatique Propriété D'Expansion À L'Aide De Maven

Mais si nous sommes à l'aide de yaml pour stocker les propriétés de l'application, nous devons remplacer le séparateur @ avec une autre, par exemple ^ 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>

Ensuite l'utiliser en application.yml:

app:
  version: ^project.version^
  name: ^project.name^

2voto

TheBakker Points 1118

C'est probablement parce que votre principal pom ne pas déclarer printemps-amorçage-starter-parent que son parent pom. Parce que quand donc, le filtrage se fait par défaut, sans avoir besoin de déclarer le filtrage explicitement

Pour moi, le passage à partir de :

<parent>
    <groupId>com.mycompany</groupId>
    <artifactId>mycompany-parent</artifactId>
    <version>20</version>
</parent>

pour :

<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 correction du problème sans avoir à déclarer le filtrage.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X