gradle 构建项目添加版本信息,打包使用 spring boot 的打包插件
build.gradle
配置文件
groovy
bootJar {
manifest {
attributes(
'Project-Name': project.name,
'Project-Version': project.version,
"project-Vendor": "XXX Corp",
"Built-By": "Gradle ${gradle.gradleVersion}",
"Built-At": new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()),
'Git-Branch': getGitBranch(),
'Git-Commit': getGitCommit(),
'Git-Commit-Time': getGitCommitTime()
)
}
}
// 获取当前分支名称
static def getGitBranch() {
try {
def branch = 'git rev-parse --abbrev-ref HEAD'.execute().text.trim()
return branch ?: 'unknown'
} catch (Exception e) {
System.err.println("fail to get branch, errMsg:" + e.getMessage())
return 'unknown'
}
}
// 获取当前提交的记录的commitId
static def getGitCommit() {
try {
def commit = 'git rev-parse HEAD'.execute().text.trim()
return commit ?: 'unknown'
} catch (Exception e) {
System.err.println("fail to get commit id, errMsg:" + e.getMessage())
return 'unknown'
}
}
// 获取当前Git提交的时间
static def getGitCommitTime() {
try {
def commitTime = 'git show -s --format=%ct HEAD'.execute().text.trim()
return commitTime ? new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(Long.parseLong(commitTime) * 1000L)) : 'unknown'
} catch (Exception e) {
System.err.println("fail to get commit time, errMsg:" + e.getMessage())
return 'unknown'
}
}
版本信息模型
java
public class VersionModel {
private String projectName;
private String projectVersion;
private String projectVendor;
private String builtBy;
private String builtAt;
private String gitBranch;
private String gitCommit;
private String gitCommitTime;
public String getProjectName() {
return projectName;
}
public void setProjectName(String projectName) {
this.projectName = projectName;
}
public String getProjectVersion() {
return projectVersion;
}
public void setProjectVersion(String projectVersion) {
this.projectVersion = projectVersion;
}
public String getProjectVendor() {
return projectVendor;
}
public void setProjectVendor(String projectVendor) {
this.projectVendor = projectVendor;
}
public String getBuiltBy() {
return builtBy;
}
public void setBuiltBy(String builtBy) {
this.builtBy = builtBy;
}
public String getBuiltAt() {
return builtAt;
}
public void setBuiltAt(String builtAt) {
this.builtAt = builtAt;
}
public String getGitBranch() {
return gitBranch;
}
public void setGitBranch(String gitBranch) {
this.gitBranch = gitBranch;
}
public String getGitCommit() {
return gitCommit;
}
public void setGitCommit(String gitCommit) {
this.gitCommit = gitCommit;
}
public String getGitCommitTime() {
return gitCommitTime;
}
public void setGitCommitTime(String gitCommitTime) {
this.gitCommitTime = gitCommitTime;
}
@Override
public String toString() {
return "VersionModel{" +
"projectName='" + projectName + '\'' +
", projectVersion='" + projectVersion + '\'' +
", implementationVendor='" + projectVendor + '\'' +
", builtBy='" + builtBy + '\'' +
", builtAt='" + builtAt + '\'' +
", gitBranch='" + gitBranch + '\'' +
", gitCommit='" + gitCommit + '\'' +
", gitCommitTime='" + gitCommitTime + '\'' +
'}';
}
}
版本工具类
java
import com.alibaba.fastjson.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.util.jar.Attributes;
import java.util.jar.Manifest;
public class BuildUtils {
public static final String projectName = "Project-Name";
public static final String projectVersion = "Project-Version";
public static final String projectVendor = "Project-Vendor";
public static final String builtBy = "Built-By";
public static final String builtAt = "Built-At";
public static final String gitBranch = "Git-Branch";
public static final String gitCommit = "Git-Commit";
public static final String gitCommitTime = "Git-Commit-Time";
private static final Logger log = LoggerFactory.getLogger(BuildUtils.class);
public static String getManifestAttribute(String attributeName) {
try {
Manifest manifest = new Manifest(BuildUtils.class.getResourceAsStream("/META-INF/MANIFEST.MF"));
Attributes attributes = manifest.getMainAttributes();
return attributes.getValue(attributeName);
} catch (IOException e) {
log.warn("fail to get info from manifest file, errMsg:{}", e.getMessage(), e);
return "unknown";
}
}
public static Attributes getManifestAttribute() {
try {
Manifest manifest = new Manifest(BuildUtils.class.getResourceAsStream("/META-INF/MANIFEST.MF"));
return manifest.getMainAttributes();
} catch (IOException e) {
log.warn("fail to get info from manifest file, errMsg:{}", e.getMessage(), e);
return new Attributes();
}
}
public static String getManifestAttributeJsonFormat() {
return JSONObject.toJSONString(getVersionModel(), true);
}
public static VersionModel getVersionModel() {
VersionModel versionModel = new VersionModel();
try {
Manifest manifest = new Manifest(BuildUtils.class.getResourceAsStream("/META-INF/MANIFEST.MF"));
versionModel.setBuiltAt(manifest.getMainAttributes().getValue(builtAt));
versionModel.setBuiltBy(manifest.getMainAttributes().getValue(builtBy));
versionModel.setProjectName(manifest.getMainAttributes().getValue(projectName));
versionModel.setProjectVersion(manifest.getMainAttributes().getValue(projectVersion));
versionModel.setProjectVendor(manifest.getMainAttributes().getValue(projectVendor));
versionModel.setGitBranch(manifest.getMainAttributes().getValue(gitBranch));
versionModel.setGitCommit(manifest.getMainAttributes().getValue(gitCommit));
versionModel.setGitCommitTime(manifest.getMainAttributes().getValue(gitCommitTime));
} catch (IOException e) {
log.warn("fail to get info from manifest file, errMsg:{}", e.getMessage(), e);
}
return versionModel;
}
}
方法1 controller 示例
java
@RestController
@RequestMapping("/version")
public class VersionController {
@GetMapping("/build")
public VersionModel getVersionModel(){
return BuildUtils.getVersionModel();
}
}
方法2 执行 jar 包中的类执行获取版本信息
java
package com.version;
public class Version {
public static void main(String[] args) {
System.out.println(BuildUtils.getManifestAttributeJsonFormat());
}
}
java -cp you-app.jar -Dloader.main=com.version.Version org.springframework.boot.loader.PropertiesLauncher