在Spring应用程序中嵌入唯一版本号的策略是什么?
我使用Spring Boot和Spring Web获得了一个应用程序。
它足够成熟,我想对它进行版本化并在运行时看到它显示在屏幕上。
答案 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 }
关于以下内容的代码正在发生:
processResources
任务
version.properties
文件并用我们的变量填充它。
prodVersion
取自Gradle项目版本。它通常是设定的
作为version
文件中的gradle.properties
(一般构建的一部分)
建立)。 考虑到您使用的是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