- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) >
- 如何獲取Maven項目的版本號
目前大多數Spring Boot項目都會(huì )打成Jar包,所以什么War包、Ear包的就先不摸索了。
我們先解壓一個(gè)Spring Boot應用Jar包看看里面能不能找到一些蛛絲馬跡。在META-INF文件夾中找到了兩個(gè)相關(guān)的東西,一個(gè)是MANIFEST.MF:
Manifest-Version: 1.0 Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx Implementation-Title: spring-boot-version Implementation-Version: 1.0.23 Spring-Boot-Layers-Index: BOOT-INF/layers.idx Start-Class: cn.felord.SpringBootVersionApplication Spring-Boot-Classes: BOOT-INF/classes/ Spring-Boot-Lib: BOOT-INF/lib/ Build-Jdk-Spec: 1.8 Spring-Boot-Version: 2.4.5 Created-By: Maven Jar Plugin 3.2.0 Main-Class: org.springframework.boot.loader.JarLauncher
里面包含了我定義的版本號1.0.23,Implementation-Version這個(gè)值好像通過(guò)代碼能夠獲得:
String version = this.getClass().getPackage().getImplementationVersion()
但是用IDE啟動(dòng)發(fā)現version=null,不過(guò)用java -jar運行時(shí)version = 1.0.23??赡芘cIDE運行并不是通過(guò)jar的方式有關(guān)。
另一個(gè)是pom.properties,Maven項目編譯會(huì )生成一個(gè)Properties配置文件:
artifactId=spring-boot-version groupId=cn.felord version=1.0.23
這豈不是讀取Properties文件就可以了?
String path = "META-INF/maven/cn.felord/spring-boot-version/pom.properties"; ClassPathResource resource = new ClassPathResource(path); InputStream inputStream = resource.getInputStream(); try (InputStreamReader reader = new InputStreamReader(inputStream)) { try (BufferedReader bufferedReader = new BufferedReader(reader)) { bufferedReader.lines() .forEach(System.out::println); } } catch (Exception ignored) { }
這豈不是讀取Properties文件就可以了?
String path = "META-INF/maven/cn.felord/spring-boot-version/pom.properties"; ClassPathResource resource = new ClassPathResource(path); InputStream inputStream = resource.getInputStream(); try (InputStreamReader reader = new InputStreamReader(inputStream)) { try (BufferedReader bufferedReader = new BufferedReader(reader)) { bufferedReader.lines() .forEach(System.out::println); } } catch (Exception ignored) { }
依然只能從jar讀取,而且比較麻煩。這兩種方式都要依賴(lài)jar包,有木有不單純依賴(lài)jar包的呢?
Maven在構建項目時(shí)可以通過(guò)資源插件將構建屬性即pom.xml中的屬性注入到指定的資源文件中,具體操作為:
<build> ... <resources> <!-- include main.properties --> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> <includes> <include>main.properties</include> </includes> </resource> </resources> ... </build>
恰好spring-boot-starter-parent中已經(jīng)設置了這種方式。
<resource> <directory>${basedir}/src/main/resources</directory> <filtering>true</filtering> <includes> <include>**/application*.yml</include> <include>**/application*.yaml</include> <include>**/application*.properties</include> </includes> </resource>
如果你是application.properties,你可以通過(guò)下面的方式來(lái)接收版本號:
application.version = ${project.version}
如果是application.yaml,你可以通過(guò)下面的方式來(lái)接收版本號:
application: version: '@project.version@'
然后如何取值就不用多說(shuō)了吧。這種方式不依賴(lài)jar包,使用起來(lái)也很簡(jiǎn)單。
Spring Boot其實(shí)已經(jīng)內置了獲取項目構建信息的自動(dòng)配置ProjectInfoAutoConfiguration,它包含一個(gè)條件BeanBuildProperties:
@ConditionalOnResource( resources = {"${spring.info.build.location:classpath:META-INF/build-info.properties}"} ) @ConditionalOnMissingBean @Bean public BuildProperties buildProperties() throws Exception { return new BuildProperties(this.loadFrom(this.properties .getBuild() .getLocation(), "build", this.properties .getBuild().getEncoding())); }
這個(gè)BuildProperties提供了不少構建信息:
public class BuildProperties extends InfoProperties { public BuildProperties(Properties entries) { super(processEntries(entries)); } public String getGroup() { return this.get("group"); } public String getArtifact() { return this.get("artifact"); } public String getName() { return this.get("name"); } public String getVersion() { return this.get("version"); } public Instant getTime() { return this.getInstant("time"); } }
其中的條件build-info.properties可以通過(guò)Spring Boot插件spring-boot-maven-plugin執行下面的命令生成:
mvn spring-boot:build-info
我們只需要配置插件為:
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal> build-info </goal> </goals> </execution> </executions> </plugin>
就能使得BuildProperties生效,我們可以輕松取得相關(guān)的信息:
{ "version" : "1.0.23", "group" : "cn.felord", "artifact" : "spring-boot-version", "name" : "spring-boot-version", "time" : { "epochSecond" : 1620664643, "nano" : 591000000 } }
今天介紹了幾種從通過(guò)API獲取項目構建版本信息的方法,有什么用呢?主要用于項目監控,發(fā)版審計,DevOps等領(lǐng)域,包括Spring Boot的自定義banner。如果你的項目涉及到CI/CD,很可能要涉及到這一方面。 如果你知道更好用的獲取方法歡迎留言討論,我來(lái)拋磚引玉。
以上就是如何獲取Maven項目的版本號的詳細內容,更多關(guān)于獲取Maven項目的版本號的資料請關(guān)注腳本之家其它相關(guān)文章!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系QQ:712375056 進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。
Copyright ? 2009-2021 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 珠海市特網(wǎng)科技有限公司 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站