1. 程式人生 > >maven:讀取程式版本號的三種方案

maven:讀取程式版本號的三種方案

方案1

在應用專案中,如果應用程式需要獲取當前程式的版本號,可以讀取”/META-INF/maven/${groupId}/${artifactId}/pom.properties“,獲取maven生成的版本資訊。
當然前提用應用程式在執行時得知道自己的groupIdartifactId,否則無法定位路徑。

pom.properties內容示例

#Created by Apache Maven .5.0
version=1.0.4-SNAPSHOT
groupId=com.gitee.l0km
artifactId=facelog-service

這種方法很簡單,但也有缺點:
貌似這種方法只能獲取maven預設定義${project.version}

,無法加入自定義的資訊。

方案2

還有一個方案就是直接將版本資訊寫入MANIFEST.MF。通過java.util.jar.Manifest來讀取解析MANIFEST.MF來獲取版本號。
如下增加buildnumber-maven-plugin外掛,並給maven-jar-plugin外掛指定寫入MANIFEST.MF的引數。

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>buildnumber-maven-plugin</artifactId
>
<version>1.2</version> <executions> <execution> <goals> <goal>create</goal> </goals> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId
>
<artifactId>maven-jar-plugin</artifactId> <version>3.0.2</version> <configuration> <archive> <manifestEntries> <!-- 專案版本號 --> <Project-Version>${project.version}</Project-Version> <!-- buildnumber外掛提供的 SCM(git/svn等)版本號 --> <Scm-Version>${buildNumber}</Scm-Version> <!-- 時間戳 --> <Timestamp>${maven.build.timestamp}</Timestamp> </manifestEntries> </archive> </configuration> </plugin>

方案3

前面兩種方案,都需要將應用程式打成jar包才能讀取版本資訊。
那麼程式在開發除錯的時候,並沒有生成pom.properties,和MANIFEST.MF,也就無法讀取版本資訊了。
所以另一種思路就是用 template-maven-plugin外掛讓maven自動生成一個包含版本資訊的程式碼如Version.java。這樣任何時候,程式都能很方便的知道自己的版本號了。

模板

首先需要一個程式碼模板Version.java,示例如下:

package net.gdface.facelog.service;
public final class Version {
    /** project version */
    public static final String VERSION = "${project.version}";
    /** SCM(git) revision */
    public static final String SCM_REVISION= "${buildNumber}";
    /** SCM branch */
    public static final String SCM_BRANCH = "${scmBranch}";
    /** build timestamp */
    public static final String TIMESTAMP ="${buildtimestamp}";
}

模板放在/src/main/java/java-templates/${package_of_template}/

原本在模板檔案中用maven內建變數${maven.build.timestamp}做時間戳,實際執行並沒有被正確替換,不知道原因。所以改為使用buildnumber-maven-plugin外掛(goal create-timestamp)生成的時間戳${buildtimestamp}

外掛

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>buildnumber-maven-plugin</artifactId>
    <version>1.4</version>
    <executions>
        <execution>
            <id>bn1</id>
            <goals>
                <!-- 建立${buildNumber} -->
                <goal>create</goal>
            </goals>
        </execution>
        <execution>
            <id>bn2</id>
            <goals>
                <!-- 建立時間戳${buildtimestamp} -->
                <goal>create-timestamp</goal>
            </goals>
            <configuration>
                <!-- 指定時間戳變數名 -->
                <timestampPropertyName>buildtimestamp</timestampPropertyName>
                <!-- 指定日期格式 -->
                <timestampFormat>yyyy-MM-dd HH:mm:ss</timestampFormat>
            </configuration>
        </execution>
    </executions>
</plugin>
<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>templating-maven-plugin</artifactId>
    <version>1.0.0</version>
    <executions>
        <execution>
            <id>filter-src</id>
            <goals>
                <goal>filter-sources</goal>
            </goals>
        </execution>
    </executions>
</plugin>

template-maven-plugin外掛會將/src/main/java/java-templates/資料夾下的所有模板中的${xxx}佔位符都用maven中同名的變數替換一遍,
生成的Version.java${project.build.directory}/generated-sources/${package_of_template}下,並且該資料夾會自動成為原始碼資料夾加入編譯過程。

參考資料