使用thymeleaf和springboot在标题中显示应用程序版本

时间:2016-09-01 15:33:50

标签: maven spring-boot

我想在我的htm页面中显示我的webapp版本,使用类似的东西(百里香内部):

<h4 th:text="${version}">Version</h4>

数据在pom.xml中设置良好:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>fr.test.navig</groupId>
    <artifactId>navigo</artifactId>
    <version>2.0.3-SNAPSHOT</version>
...
<!-- Package as an executable jar -->
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>Application</mainClass>
                        <addDefaultImplementationEntries>
                            true
                        </addDefaultImplementationEntries>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
    </plugins>
</build>

我可以在MANIFEST.MF(在META-INF下生成的jar中)中看到它:

  

实施 - 版本:2.0.3-SNAPSHOT

我试图在控制器中获取应用程序版本并将其设置在ModuleAttribute中:

@ModelAttribute("version")
public String getVersion() {
    logger.info("ModelAttribute to get application version");
    return getClass().getPackage().getImplementationVersion();
}

getClass().getPackage().getImplementationVersion()值为null。实际上,package implementationVersion不是默认情况下应用程序的实现版本。

3 个答案:

答案 0 :(得分:6)

我知道我迟到了Patrick's answer而Spring文档在这件事上有很大的帮助。

1。如果您的 pom.xml 使用 spring-boot-starter-parent 作为父级,则可以使用@project.version@ application.properties 文件中获取版本(以及任何其他Maven属性)。根据Spring文档:

  

您可以使用自动从Maven项目扩展属性   资源过滤。如果你使用spring-boot-starter-parent你     能够   然后通过@ .. @ placeholders

参考你的Maven'项目属性'

Maven pom.xml

<groupId>com.foo</groupId>
<artifactId>bar</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>Foo</name>
<description>Bar</description>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.4.RELEASE</version>
    <relativePath /> <!-- lookup parent from repository -->
</parent>

Spring application.properties

foo.app.version=@project.version@

2. 然后可以使用注释为@ControllerAdvice的类将版本注入模型属性。

@ControllerAdvice
public class ControllerAdvice {

    @Value("${foo.app.version}")
    private String applicationVersion;

    @ModelAttribute("applicationVersion")
    public String getApplicationVersion() {
        return applicationVersion;
    }

}

3. 最后,Thymeleaf可以像任何其他人一样访问此模型属性。

<th:block th:text="${applicationVersion}"></th:block>

希望这有帮助!

答案 1 :(得分:2)

这是我发现的最简单的方法: 在我的控制器中:

@ModelAttribute("version")
public String getVersion() throws IOException {
    logger.info("ModelAttribute to get application version");
    Manifest manif = new Manifest(
            Application.class.getResourceAsStream("/META-INF/MANIFEST.MF"));
    String version = (String) manif.getMainAttributes().get(
            Attributes.Name.IMPLEMENTATION_VERSION);
    return version;
}

在我的htm页面中:

<h4 th:text="${version}">Version</h4>

答案 2 :(得分:0)

您需要配置资源插件以激活对需要使用来自POM文件的属性进行丰富的文件的过滤。

在生成的战争中,版本(事实上${project.version})将被硬编码到您的POM版本。