SBT項目訪問構建時間和GIT版本的方法

需求是可以查看當前web應用對應的是哪一個源碼版本,何時編譯的,以肯定某些錯誤是由於沒有部署新版本致使的,仍是存在未解決bug。前端

對sbt和scala不熟,因此這個方案可能很笨拙,但能解決問題。基本思路是在編譯以前,把構建時間和GIT版本寫入一個文本文件中,運行時由後臺java代碼讀取,發送給前端。java

sbt文件能夠是.sbt後綴,也能夠是.scala後綴,若是是.scala後綴,則限制不多,能夠隨意作處理,但通常使用的是.sbt後綴文件。.sbt文件中只能寫函數,因此把構建信息寫入文件的操做都放在函數中。git

在.sbt文件中添加如下內容:web

import java.text.SimpleDateFormat
import java.util.Date

...

//函數NowDate取當前時間也就是構建時間
def NowDate(): String = {
  val now: Date = new Date()
  val dateFormat: SimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
  val date = dateFormat.format(now)
  return date
}

//取GIT的header並寫入public文件夾下的文本文件,同時也把構建時間寫入另外一個文本文件
def createGitHeaderFile(dir:String):sbt.File={
  val propFile = sourceDir("/public/data/gitv.txt")
  try{
    val h =Process("git rev-parse HEAD").lines.head
    IO.write(propFile, h)
  }catch{
    case ex:Exception => {
      ex.printStackTrace()
      IO.write(propFile, "ERROR_GET_GIT_HEADER_FAIL")
    }
  }

  val btFile = sourceDir("/public/data/buildtime.txt")
  val nowText = NowDate()
  IO.write(btFile, nowText)

  return file(s"${file(".").getAbsolutePath}/$dir")
}

//這樣寫其實只是爲了把git版本header寫入文件public/data/gitv.txt
//這裏指定額外的源文件路徑,能夠調用函數,因此利用這個機會調用上面定義的函數,把構建信息寫入
unmanagedSourceDirectories in Compile ++= Seq(
  createGitHeaderFile("/scala")
)

在web項目中的java文件讀取構建信息,而後能夠進行處理或者發送給前端函數

istr = env.resourceAsStream("public/data/gitv.txt");
if (istr.nonEmpty()){
    InputStream i=istr.get();

    BufferedReader reader = new BufferedReader(new InputStreamReader(i));
    try {
        String s = reader.readLine();
        if (s!=null){
            gitHeader=s;
        }
    } catch (IOException e) {
        e.printStackTrace();
        System.out.println("cannot read public/data/gitv.txt");
    }
}

istr = env.resourceAsStream("public/data/buildtime.txt");
if (istr.nonEmpty()){
    InputStream i=istr.get();

    BufferedReader reader = new BufferedReader(new InputStreamReader(i));
    try {
        String s = reader.readLine();
        if (s!=null){
            this.buildTime=s;
        }
    } catch (IOException e) {
        e.printStackTrace();
        System.out.println("cannot read public/data/buildtime.txt");
    }
}
相關文章
相關標籤/搜索