spring Sping Boot banner.txt中未显示应用程序版本

pu82cl6c  于 2023-11-16  发布在  Spring
关注(0)|答案(8)|浏览(284)

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

${application.version}

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

myzjeezk

myzjeezk1#

好的,如果我构建项目并通过java -jar运行它,版本会被打印出来。但是如果我在IDE(IntelliJ IDEA)中启动应用程序,版本将不会被打印出来。
根据Sping Boot 关于定制Banner的文档,${application.version}的值是从jar清单中获取的。
MANIFEST. MF中声明的应用程序版本号。例如,Implementation-Version:1.0打印为1.0。
当从IDE运行时,通常会对IDE编译的类文件执行。IDE通常不会通过一个完整的周期来构建带有清单的整个jar。因此,在运行时没有MANIFEST.MF可用于替换${application.version}的值,您只能使用空令牌。
这不是代码中的错误,您已经看到在执行完整的jar构建时它可以正常工作。如果在运行IDE时修复此问题确实很重要,然后,您可以考虑设置一个自定义构建步骤,首先完成完整的jar构建和清单生成。不过,这可能有点过头了。以后可以在IDE之外通过对真实的版本进行测试来验证横幅jar的构造。

6yoyoihd

6yoyoihd2#

另一个解决方案是:
使用maven资源插件来“过滤”(替换)资源文件中的属性。
在pom中,使用以下定义激活资源过滤:

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

字符串
在application.properties文件中:

info.a[email protected]@
[email protected]@


在banner.txt文件中:

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

x8diyxa7

x8diyxa73#

仅供参考,以下是我在Sping Boot 2中使用基于Gradle的项目(使用Sping Boot Gradle插件)的命令行 * 中找到的工作。Intellij的控制台仍然不适合我,但problem has been around for several years now
在标准的2.0.5.RELEASE build.gradle上使用jar任务不起作用,因为bootJar任务优先:
默认情况下,当配置了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及其等效类。发现或配置的主类将自动添加到MANIFEST.MF中作为“Start-Class”。
一旦这起作用,您就可以像往常一样在Sping Boot banner.txt文件中使用${application.title}${application.version}

mnowg1ta

mnowg1ta4#

在我的例子中,我查看了spring-boot-maven-plugin创建的清单,里面没有Implementation-version。
为了添加它,我在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时,我才能看到应用程序版本的横幅

2ekbmq32

2ekbmq325#

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

字符串

svdrlsy4

svdrlsy46#

对我来说,作品完美地取代文本上的mvn建立:
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中删除了${}

u7up0aaq

u7up0aaq7#

基本上,${application.title} ${application.formatted-version}值是从打包的jar文件的manifest文件中选取的。所以我不确定我们是否真的可以在项目的构建生命周期中打印它们。enter link description here
你可以参考下面的例子

jqjz2hbq

jqjz2hbq8#

我用了另一种方法可能会有帮助,你可以在pom.xml中添加一个插件

<plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <version>3.2.0</version>
            <executions>
                <execution>
                    <id>default-resources</id>
                    <phase>validate</phase>
                    <goals>
                        <goal>copy-resources</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${project.build.directory}/classes</outputDirectory>
                        <useDefaultDelimiters>false</useDefaultDelimiters>
                        <delimiters>
                            <delimiter>#</delimiter>
                        </delimiters>
                        <resources>
                            <resource>
                                <directory>src/main/resources/</directory>
                                <filtering>true</filtering>
                                <includes>
                                    <include>*.yml</include>
                                </includes>
                            </resource>
                            <resource>
                                <directory>src/main/resources/</directory>
                                <filtering>false</filtering>
                                <excludes>
                                    <exclude>*.yml</exclude>
                                </excludes>
                            </resource>
                        </resources>
                    </configuration>
                </execution>
            </executions>
        </plugin>

字符串
并在资源下创建一个banner.txt,

,------.,--.   ,--.  ,---.  ,--.   ,--.,------. ,--.   ,------. 
|  .---' \  `.'  /  /  O  \ |   `.'   ||  .--. '|  |   |  .---' 
|  `--,   .'    \  |  .-.  ||  |'.'|  ||  '--' ||  |   |  `--,  
|  `---. /  .'.  \ |  | |  ||  |   |  ||  | --' |  '--.|  `---. 
`------''--'   '--'`--' `--'`--'   `--'`--'     `-----'`------' 
                                                                
${application.title} ${application.version}


并在您的application.yml文件中Assert,您具有以下属性

application:
  title: Hello
  version: V1

相关问题