应用程序版本未显示在 Spring Boot banner.txt 中

Posted

技术标签:

【中文标题】应用程序版本未显示在 Spring Boot banner.txt 中【英文标题】:Application version does not show up in Spring Boot banner.txt 【发布时间】:2016-04-03 20:26:19 【问题描述】:

运行应用程序时,banner.txt 中定义的应用程序版本不会显示在控制台上。它是根据docs of Spring Boot定义的

$application.version

项目使用 spring-boot-starter-parent 作为父 pom(来自start.spring.io的基本项目设置)

【问题讨论】:

这对我来说很好。我从 start.spring.io 生成了一个项目。然后,我添加了文件 src/main/resources/banner.txt,内容引用了$application.version。然后,我重新运行./mvnw clean package。然后,我跑了java -jar target/demo-0.0.1-SNAPSHOT.jar。它按预期打印了0.0.1-SNAPSHOT。如果这不适合您,您是否想提供更多详细信息,例如您的 banner.txt 文件? 【参考方案1】:

好的,如果我构建项目并通过 java -jar 运行它,则会打印版本。但是如果我在我的 IDE (IntelliJ IDEA) 中启动应用程序,则不会打印该版本。

根据 Customizing the Banner 上的 Spring Boot 文档,$application.version 的值取自 jar 清单。

在 MANIFEST.MF 中声明的应用程序的版本号。例如 Implementation-Version: 1.0 打印为 1.0。

从 IDE 运行时,通常会针对 IDE 编译的类文件执行。 IDE 通常不会经历使用清单构建整个 jar 的完整周期。因此,在运行时没有可用的 MANIFEST.MF 来替换 $application.version 的值,而您只剩下裸令牌。

这不是您的代码中的错误,您已经看到它在构建完整的 jar 时可以正常工作。如果在通过 IDE 运行时修复此问题真的很重要,那么您可以考虑设置一个自定义构建步骤,该步骤首先通过完整的 jar 构建和清单生成。不过,这可能是矫枉过正。稍后可以通过针对 jar 的真实发布版本进行测试,在 IDE 之外验证横幅。

【讨论】:

即使使用 java 运行 jar 文件也对我不起作用。知道为什么吗?我的banner.txt 文件中有这一行:Version $application.version,在控制台中显示完全相同 @AlirezaMirian,您是否按照我在对该问题的评论中描述的完全相同的步骤来构建和执行?这对我来说很好。如果那仍然对您不起作用,那么恐怕我没有想法。您的环境中一定有什么不同,但我不确定是什么。 如果将 spring-boot 应用程序打包为 WebApp 并将其部署在 Liberty 服务器上,它不会打印应用程序版本等。【参考方案2】:

在我的例子中,我查看了 spring-boot-maven-plugin 创建的清单 并且里面没有实现版本。

要添加它,我在我的 pom.xml 的 build.plugins 部分添加了插件 maven-jar-plugin。

<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>

在那之后,正如之前提到的,只有当我执行 java -jar et 而不是我的 ide 时,我才能看到带有应用程序版本的横幅

【讨论】:

【参考方案3】:

仅供参考,这是我在 Spring Boot 2 中使用基于 Gradle 的项目(使用 Spring Boot Gradle 插件)发现的命令行。 Intellij 的控制台仍然不适合我,但是 problem has been around for several years now。

在标准 2.0.5.RELEASE build.gradle、because the bootJar task takes precedence 上使用 jar 任务对我不起作用:

默认情况下,当 bootJar 或 bootWar 任务被配置时,jar 或 war 任务被禁用。

所以我尝试了bootJar 任务,它可以工作:

version = '0.0.1-SNAPSHOT'

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

注意:不需要mainClassName 及其等价物if you have only one main class。发现或配置的主类会作为“Start-Class”自动添加到 MANIFEST.MF。

一旦它工作正常,您可以像往常一样在您的Spring Boot banner.txt file 中使用$application.title$application.version

【讨论】:

【参考方案4】:

对我来说,完美地替换 mvn build 上的文本:

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>

是的,我确实从 banner.txt 中删除了 $

【讨论】:

【参考方案5】:

另一种解决方案:

使用 maven 资源插件“过滤”(替换)资源文件中的属性。

在 pom 中,使用以下定义激活资源过滤:

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

在 application.properties 文件中:

info.app.name=@project.artifactId@
info.app.version=@project.version@

在banner.txt文件中:

$info.app.name ($info.app.version)

【讨论】:

【参考方案6】:

基本上 $application.title $application.formatted-version 值是从打包的 jar 文件的清单文件中选取的。所以我不确定我们是否真的可以在项目的构建生命周期中打印它们。enter link description here

你可以参考下面的例子

【讨论】:

能否请您添加一个示例。 boraji.com/spring-boot-changing-the-default-banner-example 请参考这个例子【参考方案7】:

您还可以在banner.txt 中使用资源过滤。只需在 banner.txt 中使用 $project.version

maven 示例:

<resources>
            <resource>
                <filtering>true</filtering>
                <directory>src/main/resources</directory>
                <includes>
                    <include>banner.txt</include>
                </includes>
            </resource>
        </resources>

【讨论】:

以上是关于应用程序版本未显示在 Spring Boot banner.txt 中的主要内容,如果未能解决你的问题,请参考以下文章

spring-boot-maven-plugin未指定版本导致的编译错误

spring-boot-maven-plugin未指定版本导致的编译错误

Spring sleuth with Spring Boot(日志相关) - Traceid 和 SpanId 未显示

thymeleaf + spring-boot 验证错误未显示在 html 上

Spring-Boot-Actuator Endpoint Prometheus 未正确显示

Spring boot 2.1 error.html 页面未显示[重复]