跳到主要內容

[Maven] 增加建構 (build) 過程的資訊到 Manifest 中

自動產生建構相關的資訊

在部署到伺服器後,有時會弄不清楚這個到底是根據哪一個 commit 發布的、何時發布的、某個函示庫使用哪個版本,或是

  • 不想一直修改版號,想要用發布時間代替版號
  • 頻繁的部署到伺服器,甚至部署到不同的伺服器,你想知道目前這個伺服器上目前到底是哪一版、或執行哪個 commit 的 code

這時你可以把建構過程的資訊加入 manifest 中,再由程式讀出來顯示在適合的地方。

buildnumber 產生 git commit, git 分支 (branch) 等資訊

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>buildnumber-maven-plugin</artifactId>
    <version>1.4</version>
    <executions>
        <execution>
            <goals><goal>create</goal></goals>
        </execution>
    </executions>
    <configuration>
        <revisionOnScmFailure>0</revisionOnScmFailure>
        <useLastCommittedRevision>true</useLastCommittedRevision>
    </configuration>
</plugin>

build-helper 產生台灣時間 (GMT+8)。因為 project.build.timestamp 是 UTC+0 時間。

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>build-helper-maven-plugin</artifactId>
    <version>1.9.1</version>
    <executions>
        <execution>
            <id>timestamp-property</id>
            <goals>
                <goal>timestamp-property</goal>
            </goals>
            <configuration>
                <name>tw-timestamp</name>
                <pattern>yyyy/MM/dd HH:mm:ss</pattern>
                <timeZone>GMT+8</timeZone>
            </configuration>
        </execution>
    </executions>
</plugin>

再把以上產生的資訊,加到 manifest 中。

<plugin>
    <artifactId>maven-war-plugin</artifactId>
    <version>3.2.2</version>
    <configuration>
        <archive>
            <manifestEntries>
                <Build-Time>${tw-timestamp}</Build-Time>
                <Project-Version>${project.version}</Project-Version>
                <Git-Commit>${buildNumber}</Git-Commit>
                <Git-Branch>${scmBranch}</Git-Branch>
            </manifestEntries>
        </archive>
    </configuration>
</plugin>

可用 ServletContext 讀取 manifest 並顯示在頁面上。

InputStream inputStream = servletContext.getResourceAsStream("/META-INF/MANIFEST.MF");

遇到錯誤

我遇到幾個錯誤訊息如下:

  • The scm url cannot be null
    pom.xml 中 scm.url 必須設定

  • No such provider: ''
    <connection> 內容語法錯誤,沒有填 provider,正確語法應該是 scm:[PROVIDER]:[git repository URL]

<scm>  
 <connection>scm:git:http://gitlab.abc.com/abc/abc.git</connection>  
 <url>http://gitlab.hawk.com/abc/abc.git</url>
</scm>

其實 buildnumber plugin 也可以產生時間,預設插入 millisecond,但是我只要一設定日期格式,maven 就會插入我設定的語法字串如: yyyy/MM/dd,而不是日期字串,到 manifest 中,因此只好放棄改用 build-helper。

留言

這個網誌中的熱門文章

Code Complete, 2ed (中譯:軟體建構之道) 讀後心得

Code Complete, 2ed (中譯:軟體建構之道) 讀後心得 雖然以前在學校有修過軟體工程,但是說實在現在我對建構軟體的整個概念都來自於兩本書:「人月神話」(The Mythical Man-Month)、Code Complete[1]。我畢業後第一份工作是軟體研發工程師,我們公司所開發的系統大約有近百位工程師共同維護,當然各有依功能與專業知識將系統劃分不同的區 塊來維護,在面對大型的系統與這麼多人寫程式是以前在學校沒有遇過的,因此也開始思考怎樣才是好的軟體開發方式。從大學好友那探聽到了Code Complete這本書,花了上千元買了英文版,(現在中文版已出,簡體版聽說只要三分之一的價錢)認真讀了幾篇之後,真是如獲至寶,於是自己讀過後,還跟同事組成讀書會一同研討這本書。 作者 Steve McConnell (個人Blog http://www.stevemcconnell.com/ )著作不算量大,但是我看過的幾本質量都很好,印象中他曾經在微軟工作過,後來成立一家軟體顧問公司 Construx Software 。 這本書(書本網站 http://cc2e.com/Default.aspx )的討論主題很廣泛,但是並不空泛,從最小的、最基本的如何寫出好的程式, 例如函式(routine)、註解 (comment)、變數的命名等,也談整個軟體建構的過程除錯、測試,最後也談到軟體工程師個人能力與技術生涯的發展,算是各方面都有提及。但是我比較 建議有半年以上的實際程式經驗來讀這本書比較適合,我自認為如果我在學生時代接觸本書,可能沒有什麼太大的感觸,因為面對的都是小格局、人數少的小系統, 書中所探討的原則與例子,很多時候沒有團隊開發或大型系統的經驗,很難體會。但稍有經驗的人,看完之後保證在程式撰寫與軟體開發方面的觀念會有很大的提 昇。 Table of Content Laying the Foundation 1 Welcome to Software Construction 2 Metaphors for a Richer Understanding of Software Development 3 Measure Twice, Cut Once: Upstream Prerequisites 4 Key...

innerHTML 的安全風險

問題 若你要實作一個使用者輸入的功能,並把輸入的內容顯示在網頁上時,應避免把使用者輸入的值直接指定給某個 element 的 innerHTML 。因為若是使用者輸入包含 HTML、JavaScript, innerHTML 就會解析並執行: var userInput = '<img src="javascript:alert("XSS")">' element . innerHTML = userInput ; 因此可能 user A 的惡意輸入,會被系統顯示到 user B 的畫面上,進而執行特定成程式碼而造成 XSS 攻擊 。 解法 一般會先想到 encode HTML,但是如果只是要顯示文字,將使用者輸入值指定給 textContent 會更簡單,無需 encode,該值會被當成純文字處理,並不會執行 javascript。 var userInput = '<img src="javascript:alert("XSS")">' element . textContent = userInput ;

ZK 教學 - 常見錯誤用法 06 - 慎選 data binding 語法

慎選 data binding 語法 最常用的語法有以下 4 種: @init: 只從 ViewModel 載入一次 @load:載入並追蹤 ViewModel 變化 @save:寫入 ViewModel1 @bind:(雙向)等於 @load + @save 後面 3 種因為需要持續維持(追蹤)元件與 ViewModel 的綁定關係,伺服器需要建立 tracking node,因此成本較高。 依對系統的負擔排名如下: 因此如果沒有動態變化的需要,請使用 @init 。 例如在 Listbox , Grid , Tree 內的 <template> 若只是顯示資料,只需用 @init ,可以免去大量 tracking node 所需的記憶體。 例如: < grid width = " 400px " model = " @init(vm.itemList) " > < columns > < column label = " index " /> < column label = " name " /> </ columns > < template name = " model " > < row > < label value = " @init(forEachStatus.index) " /> < label value = " @init(each.name) " /> </ row > </ template > </ grid >