web-dev-qa-db-fra.com

La version de l'application n'apparaît pas dans Spring Boot banner.txt

La version de l'application définie dans le fichier banner.txt n'apparaît pas sur la console lors de l'exécution de l'application. Il est défini selon les docs de Spring Boot

${application.version}

Le projet utilise le printemps-boot-starter-parent comme pom parent (Configuration de base du projet à partir de start.spring.io )

14
pas2al

Ok, la version est imprimée si je construis le projet et l’exécute via Java -jar. Mais si je lance l'application dans mon IDE (IntelliJ IDEA), la version ne sera pas imprimée.

Selon la documentation de Spring Boot sur Personnalisation de la bannière , la valeur de ${application.version} est extraite du manifeste du fichier jar.

Le numéro de version de votre application tel que déclaré dans MANIFEST.MF. Par exemple, Implementation-Version: 1.0 est imprimé au format 1.0.

Lors de l'exécution à partir d'un IDE, il est typique que l'exécution se fasse sur les fichiers de classe compilés par l'EDI. Le IDE ne passe généralement pas par un cycle complet de construction du pot entier avec un manifeste. Par conséquent, MANIFEST.MF n’est pas disponible au moment de l’exécution pour remplacer la valeur ${application.version}, et le jeton vide vous en reste.

Ce n'est pas un bogue dans votre code et vous avez déjà vu qu'il fonctionnait correctement lors de la compilation complète d'un fichier jar. S'il est vraiment important de résoudre ce problème lors de l'exécution de l'EDI, vous pouvez envisager de configurer une étape de génération personnalisée qui passe d'abord par la génération complète du fichier jar et du manifeste. C'est probablement exagéré cependant. La bannière pourrait être validée ultérieurement en dehors de IDE en testant par rapport à une version réellement libérée du fichier jar.

17
Chris Nauroth

Dans mon cas, je regarde à l'intérieur du manifeste créé par spring-boot-maven-plugin Et il n'y avait aucune version d'implémentation à l'intérieur.

Pour l'ajouter, j'ajoute le plugin maven-jar-plugin dans la section build.plugins de mon pom.xml. 

<plugin>
    <groupId>org.Apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.0.2</version>
    <configuration>
         <archive>
              <manifestEntries>
                    <Implementation-Version>${project.version}</Implementation-Version>
              </manifestEntries>
         </archive>
    </configuration>
</plugin>

Après cela, comme mentionné précédemment, je peux voir la bannière avec la version de l'application uniquement lorsque je fais Java -jar et pas avec mon idée.

5
bolivier

Juste pour référence, voici ce que j’ai trouvé qui fonctionne pour la ligne de commande dans Spring Boot 2 avec un projet basé sur Gradle (à l’aide du plug-in Spring Boot Gradle). La console d’Intellij ne fonctionne toujours pas pour moi, mais ce problème existe depuis plusieurs années maintenant .

L'utilisation de la tâche jar ne fonctionnait pas pour moi sur une version 2.0.5.RELEASE build.gradle, car la tâche bootJar a priorité :

Par défaut, lorsque les tâches bootJar ou bootWar sont configurées, les tâches jar ou war sont désactivées.

J'ai donc essayé la tâche bootJar et cela fonctionne:

version = '0.0.1-SNAPSHOT'

bootJar {
    mainClassName = 'com.demo.Application'
    manifest {
        attributes('Implementation-Title':   'Demo Application',
                   'Implementation-Version': version)
    }
}

Remarque: mainClassName et ses équivalents ne sont pas nécessaires si vous n'avez qu'une classe principale . La classe principale découverte ou configurée est automatiquement ajoutée à MANIFEST.MF en tant que 'Classe de démarrage'.

Une fois que cela fonctionne, vous pouvez utiliser ${application.title} et ${application.version} comme d'habitude dans votre fichier Spring. banner.txt de Boot Spring }.

1
ben3000

Une autre solution:

Utilisez le plug-in maven resources pour "filtrer" (remplacer) les propriétés dans les fichiers de ressources.

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 fichier application.properties:

[email protected]@
[email protected]@

Dans le fichier banner.txt:

${info.app.name} (${info.app.version})
0
Nicolas Dos Santos

Pour moi fonctionne parfaitement remplacer les textes sur MVN construit par:

com.google.code.maven-replacer-plugin

  <plugin>
    <groupId>com.google.code.maven-replacer-plugin</groupId>
    <artifactId>replacer</artifactId>
    <version>1.5.3</version>
    <executions>
      <execution>
        <phase>prepare-package</phase>
        <goals>
          <goal>replace</goal>
        </goals>
      </execution>
    </executions>
    <configuration>
      <file>target/classes/banner.txt</file>
      <replacements>
        <replacement>
          <token>application.title</token>
          <value>${artifactId}</value>
        </replacement>
        <replacement>
          <token>application.version</token>
          <value>${version}</value>
        </replacement>
      </replacements>
    </configuration>
  </plugin>

Oui j'ai enlevé $ {} de banner.txt

0
NotLikeNames

Fondamentalement, les valeurs $ {application.title} $ {application.formatted-version} sont sélectionnées dans le fichier manifeste du fichier jar emballé. Je ne suis donc pas sûr que nous puissions vraiment les imprimer pendant le cycle de vie du projet. entrez la description du lien ici

vous pouvez vous référer ci-dessous exemple

0
ManjuGH