springboot獲取項目的版本信息(git+maven,項目的版本號及名稱等等)

引言

springboot獲取項目的版本其實pom集成git的插件就可以了,但是隻能獲取git的提價的commit-id等簡單的信息,如項目的版本號、名稱等這是無法獲取的,那麼來談談如何獲取自己想要的信息呢,springboot集成git插件會生成git.properties文件及maven會生成MANIFEST.MF及pom文件就可以獲取所有的相關信息,這樣就可以根據需要來進行提取了

讀取git.properties文件

集成git和maven插件

  <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>pl.project13.maven</groupId>
                <artifactId>git-commit-id-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

使用maven包時會在classes文件在生成git.properties文件,文件信息如下:

分支、commit號、構建的時間等信息

在META-INF下會生成MANIFEST.MF文件,文件信息如下:

可以看到版本號、項目名稱等

既然能得到文件,那就好辦了,因爲git.properties和MANIFEST.MF有相似的信息,我這塊按git.properties中的信息。

讀取git.properties信息工具類

@Component
@PropertySource(value = {"classpath:git.properties" }, ignoreResourceNotFound =true)
public class GitUtil {
	@Value("${git.branch}")
	private String branch;
	@Value("${git.commit.id}")
	private String gitCommitId;
	@Value("${git.remote.origin.url}")
	private String gitUrl;
	@Value("${git.build.time}")
	private String buildDate;
	@Value("${git.commit.id.abbrev}")
	private String commitIdShort;

	public String getGitCommitId() {
		return gitCommitId;
	}

	public String getBranch() {
		return branch;
	}

	public String getGitUrl() {
		return gitUrl;
	}

	public String getBuildDate() {
		return buildDate;
	}

	public String getCommitIdShort() {
		return commitIdShort;
	}
}

讀取MANIFEST.MF的信息

@Component
public class JarFileUtils {
	private static Logger log = LoggerFactory.getLogger(JarFileUtils.class);
	private static Map<String, String> map = new HashMap<>();

	public  Map<String, String> readJarFile() {
		JarFile jarFile = null;
		BufferedReader br = null;
		try {
			// 獲取jar的運行路徑,因linux下jar的路徑爲”file:/app/.../test.jar!/BOOT-INF/class!/“這種格式,所以需要去掉”file:“和”!/BOOT-INF/class!/“
			String jarFilePath = ClassUtils.getDefaultClassLoader().getResource("").getPath().replace("!/BOOT-INF/classes!/", "");
			if (jarFilePath.startsWith("file")) {
				jarFilePath = jarFilePath.substring(5);
			}
			log.debug("jarFilePath:" + jarFilePath);
			// 通過JarFile的getJarEntry方法讀取META-INF/MANIFEST.MF
			jarFile = new JarFile(jarFilePath);
			JarEntry entry = jarFile.getJarEntry("META-INF/MANIFEST.MF");
			log.info("讀取的內容:" + entry.toString());
			// 如果讀取到MANIFEST.MF文件內容,則轉換爲string
			if (entry != null) {
				InputStream in = jarFile.getInputStream(entry);

				StringBuilder sb = new StringBuilder();
				br = new BufferedReader(new InputStreamReader(in));
				String line = "";
				while ((line = br.readLine()) != null) {
					if (line != null && line.contains(":")) {
						int index = line.indexOf(":");
						map.put(line.substring(0, index).trim(), line.substring(index + 1, line.length()).trim());
					}
				}
				return map;
			}
		} catch (ServiceException ex) {
			log.debug("讀取MANIFEST.MF文件異常:" + ex.getMessage());
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if (null != br) {
					br.close();
				}
				if (null != jarFile) {
					jarFile.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

		return map;

	}

}

讀取pom的信息工具類

@Component
@ConfigurationProperties(prefix = "app")
public class Config {

	private String version;
	private String artifactId;
	private String description;

	public void setVersion(String version) {
		this.version = version;
	}

	public void setArtifactId(String artifactId) {
		this.artifactId = artifactId;
	}

	public void setDescription(String description) {
		this.description = description;
	}

	public String getVersion() {
		return version;
	}

	public String getArtifactId() {
		return artifactId;
	}

	public String getDescription() {
		return description;
	}

}

yml文件配置如下:

在寫一個統一的工具類

@Component
public class VersionUtil {
	@Autowired
	Config config;
	@Autowired
	GitUtil gitUtil;
	@Autowired
	JarFileUtils jarFileUtils;

	public VersionPo getVersion() {
		VersionPo versionPo = new VersionPo();
		Map<String,String> map=jarFileUtils.readJarFile();
		versionPo.setGIT_Revision(gitUtil.getGitCommitId());
		versionPo.setCreate_By(map.get("Created-By"));
		versionPo.setGIT_BRANCH(gitUtil.getBranch());
		versionPo.setGIT_URL(gitUtil.getGitUrl());
		versionPo.setBUILD_DATE(gitUtil.getBuildDate());
        versionPo.setArtifactId(config.getArtifactId());
        versionPo.setGIT_Revision_SHORT(gitUtil.getCommitIdShort());
		versionPo.setVersion(config.getVersion());
		versionPo.setProject(config.getDescription());
		versionPo.setBuild_Jdk(map.get("Build-Jdk"));

		return versionPo;
	}
}

及po類

public class VersionPo implements Serializable {

	/**
	 * git的全版本號
	 */
	@JSONField(name="GIT-Revision")
	private String GIT_Revision;
	/**
	 * maven版本
	 */
	@JSONField(name = "Create-By")
	private String Create_By;
	/**
	 * git的分支
	 */
	@JSONField(name = "GIT-BRANCH")
	private String GIT_BRANCH;
	/**
	 * git的url
	 */
	@JSONField(name = "GIT-URL")
	private String GIT_URL;
	/**
	 * 構建日期
	 */
	@JSONField(name = "BUILD-DATE")
	private String BUILD_DATE;
	/**
	 * 項目名稱 配合pom使用
	 */
	@JSONField(name = "artifactId")
	private String artifactId;
	/**
	 * git局部版本號
	 */
	@JSONField(name = "GIT-Revision-SHORT")
	private String GIT_Revision_SHORT;
	/**
	 * 項目的版本如2.0.1.0 配合pom使用
	 */
	@JSONField(name = "version")
	private String version;
	/**
	 * 子系統名稱
	 */
	@JSONField(name = "project")
	private String project;
	/**
	 * jdk版本
	 */
	@JSONField(name="Build_Jdk")
	private String Build_Jdk;

	public void setGIT_Revision(String GIT_Revision) {
		this.GIT_Revision = GIT_Revision;
	}

	public void setCreate_By(String create_By) {
		Create_By = create_By;
	}

	public void setGIT_BRANCH(String GIT_BRANCH) {
		this.GIT_BRANCH = GIT_BRANCH;
	}

	public void setGIT_URL(String GIT_URL) {
		this.GIT_URL = GIT_URL;
	}

	public void setBUILD_DATE(String BUILD_DATE) {
		this.BUILD_DATE = BUILD_DATE;
	}

	public void setArtifactId(String artifactId) {
		this.artifactId = artifactId;
	}

	public void setGIT_Revision_SHORT(String GIT_Revision_SHORT) {
		this.GIT_Revision_SHORT = GIT_Revision_SHORT;
	}

	public void setVersion(String version) {
		this.version = version;
	}

	public void setProject(String project) {
		this.project = project;
	}

	public void setBuild_Jdk(String build_Jdk) {
		Build_Jdk = build_Jdk;
	}

	public String getGIT_Revision() {
		return GIT_Revision;
	}

	public String getCreate_By() {
		return Create_By;
	}

	public String getGIT_BRANCH() {
		return GIT_BRANCH;
	}

	public String getGIT_URL() {
		return GIT_URL;
	}

	public String getBUILD_DATE() {
		return BUILD_DATE;
	}

	public String getArtifactId() {
		return artifactId;
	}

	public String getGIT_Revision_SHORT() {
		return GIT_Revision_SHORT;
	}

	public String getVersion() {
		return version;
	}

	public String getProject() {
		return project;
	}

	public String getBuild_Jdk() {
		return Build_Jdk;
	}
}

使用這個統一的工具類 就可以對版本信息就可以統一輸出,編寫controller進行訪問

@RestController
@RequestMapping("/appVersion")
@Api(description = "獲取項目版本信息")
public class VersionController {
	@Autowired
	VersionUtil versionUtil;

	@ResponseBody
	@GetMapping("/version")
    //ResVo是自己封裝的類
	public ResVo getConfig() {
		return ResVo.ok(versionUtil.getVersion());
	}
}

信息如下:

這樣就可以啦

如果只是需要簡單的git信息通過暴露/actuator/info接口即可。

推薦一個公衆號

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章