spring boot/spring web app嵌入版本号

Mar*_*zec 1 spring-mvc spring-boot

在Spring应用程序中嵌入唯一版本号的策略是什么?

我有一个使用Spring Boot和Spring Web的应用程序.

它已经足够成熟,我想对它进行版本化并在运行时看到它显示在屏幕上.

Ale*_*ejK 5

我相信您正在寻找的是在构建期间(通常通过Ant,Maven或Gradle等构建工具)生成此版本号作为其构建任务链的一部分.

我相信一种非常常见的方法是将版本号放入生成的JAR的Manifest.mf中然后读取它,或者创建一个文件,该文件是生成的JAR的一部分,可以由应用程序读取.

另一种解决方案是使用此处描述的Spring Boot的横幅自定义选项:http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-spring-application.html#boot-features- banner 但是,这只会允许您更改spring-boot标题.

我还相信Spring Boot会公开在您的应用程序的Manifest.MF中设置的产品版本.要实现此目的,您需要确保Implementation-Version设置清单的属性.

用于访问代码中任何位置的自定义解决方

让我们假设您希望version.properties在您的文件中src/main/resources包含您的版本信息.它将包含占位符而不是实际值,以便在构建期间可以扩展这些占位符.

version=${prodVersion}
build=${prodBuild}
timestamp=${buildTimestamp}
Run Code Online (Sandbox Code Playgroud)

既然你有这样的文件,你需要用实际数据填充它.我使用Gradle,因此我会确保processResources为构建自动运行的任务正在扩展资源.像这样的东西应该在build.gradle基于Git的代码的文件中做到:

import org.codehaus.groovy.runtime.*
import org.eclipse.jgit.api.*

def getGitBranchCommit() {
    try {
        def git = Git.open(project.file(project.getRootProject().getProjectDir()));
        def repo = git.getRepository();
        def id = repo.resolve(repo.getFullBranch());
        return id.abbreviate(7).name()
    } catch (IOException ex) {
       return "UNKNOWN"
    }

}

processResources {
    filesMatching("**/version.properties") {
        expand (
            "prodVersion": version,
            "prodBuild": getGitBranchCommit(),
            "buildTimestamp": DateGroovyMethods.format(new Date(), 'yyyy-MM-dd HH:mm') 
        )
    }
}

processResources.outputs.upToDateWhen{ false }
Run Code Online (Sandbox Code Playgroud)

在关于以下内容的代码中发生:

  1. 我们定义了一个可以从VCS中获取内部版本号的函数(在本例中为Git).提交哈希限制为7个字符.
  2. 我们将processResources任务配置为处理 version.properties文件并使用我们的变量填充它. prodVersion取自Gradle项目版本.它通常设置为versiongradle.properties文件(一般构建设置的一部分).
  3. 作为最后一步,我们确保它始终更新(Gradle有一些机制来检测是否需要处理文件)

考虑到您使用的是SVN,您需要使用getSvnBranchCommit()方法.例如,你可以使用SVNKit或类似的东西.

现在缺少的最后一件事是读取您的应用程序中使用的文件.

这可以通过简单地读取类路径资源并将其解析为来实现java.util.Properties.您可以更进一步,例如getVersion(),专门为每个字段创建访问器方法,例如getBuild(),等等.

希望这有点帮助(即使可能不是100%直接适用)