spring boot / spring web app嵌入版本号

时间:2016-01-13 17:04:34

标签: spring-mvc spring-boot

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

我使用Spring Boot和Spring Web获得了一个应用程序。

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

3 个答案:

答案 0 :(得分:5)

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

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

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

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

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

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

version=${prodVersion}
build=${prodBuild}
timestamp=${buildTimestamp}

现在您有了这样的文件,您需要填写实际数据。我使用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 }

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

  1. 我们定义了一个可以从VCS中获取内部版本号的函数 (在这种情况下是Git)。提交哈希限制为7个字符。
  2. 我们配置要处理的processResources任务 version.properties文件并用我们的变量填充它。 prodVersion取自Gradle项目版本。它通常是设定的 作为version文件中的gradle.properties(一般构建的一部分) 建立)。
  3. 作为最后一步,我们确保它始终更新(Gradle 有一些机制来检测是否有待处理的文件
  4. 考虑到您使用的是SVN,您需要使用getSvnBranchCommit()方法。例如,你可以使用SVNKit或类似的东西。

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

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

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

答案 1 :(得分:1)

我确定你可能已经找到了一些东西,因为这是一个较老的问题,但这就是我刚才所做的,它看起来不错。 (进入横幅需要你复制很多)。

我建议切换到git(它也是一个很棒的SVN客户端),然后在你的build.gradle中使用它:

// https://github.com/n0mer/gradle-git-properties
plugins {
  id "com.gorylenko.gradle-git-properties" version "1.4.17"
}
// http://docs.spring.io/spring-boot/docs/current/reference/html/deployment-install.html
springBoot {
    buildInfo()  // create  META-INF/build-info.properties
}
bootRun.dependsOn = [assemble]

这在您的SpringBoot应用程序中:

@Resource
GitProperties props;

@Resource
BuildProperties props2;

或者通过这种方式将这些属性公开到标准的spring环境中:

@SpringBootApplication
@PropertySources({
    @PropertySource("classpath:git.properties"),
    @PropertySource("classpath:META-INF/build-info.properties")
})
public class MySpringBootApplication {

然后根据需要引用各个属性。

@Value("${git.branch}")
String gitBranch;

@Value("${build.time}")
String buildTime;

答案 2 :(得分:1)

Maven可用于跟踪version number,例如:

<!-- pom.xml -->
<version>2.0.3</version>

Spring Boot可以引用该版本,并使用Actuator通过REST公开它:

# application.properties
endpoints.info.enabled=true
info.app.version=@project.version@

然后使用Ajax在浏览器中呈现版本,例如使用Polymer iron-ajax

<!-- about-page.html -->
<iron-ajax auto url="/info" last-response="{{info}}"></iron-ajax>
Application version is: [[info.app.version]]

然后,它将在浏览器中显示为:

Application version is: 2.0.3