运行应用程序时,banner.txt中定义的应用程序版本不会显示在控制台上。它是根据docs of Spring Boot
定义的${application.version}
该项目使用spring-boot-starter-parent作为父pom(来自start.spring.io的基本项目设置)
答案 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
您可以参考以下示例