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

时间:2015-12-29 21:59:41

标签: java spring maven spring-boot banner

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

定义的
${application.version}

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

7 个答案:

答案 0 :(得分:19)

  

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

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

  

MANIFEST.MF中声明的应用程序的版本号。例如,实现版本:1.0打印为1.0。

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

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

答案 1 :(得分:5)

就我而言,我查看了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而不是我的ide时看到带有应用程序版本的横幅

答案 2 :(得分:1)

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

在标准2.0.5.RELEASE Map<String, List<String>> map=new HashMap<>(); map.put("First Grade", list1); map.put("Second Grade", list2); map.put("Third Grade", list3); ObjectMapper mapper = new ObjectMapper(); try { String json = mapper.writeValueAsString(map); System.out.println(json); } catch (JsonProcessingException e) { // TODO Auto-generated catch block e.printStackTrace(); } because the bootJar task takes precedence中,使用jar任务对我不起作用:

  

默认情况下,配置bootJar或bootWar任务后,将禁用jar或war任务。

所以我尝试了build.gradle任务,它可以正常工作:

bootJar

注意:不需要version = '0.0.1-SNAPSHOT' bootJar { mainClassName = 'com.demo.Application' manifest { attributes('Implementation-Title': 'Demo Application', 'Implementation-Version': version) } } 及其等效物if you have only one main class。发现或配置的主类将作为“开始类”自动添加到MANIFEST.MF。

一旦运行成功,您就可以照常在Spring Boot banner.txt file中使用mainClassName${application.title}

答案 3 :(得分:1)

您还可以在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>

答案 4 :(得分:0)

对我来说,可以完美替换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 :(得分:0)

另一种解决方案:

使用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 :(得分:0)

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

您可以参考以下示例