2012年3月23日

使用 Groovy+AntBuilder 存取 SVN Repository

Groovy 的 AntBuilder 是相當好用的 DSL,它可以在程式中直接呼叫原本必須定義在 XML 的 Ant 工作,包括複製檔案及整個資料夾、寄送電子郵件、編譯 Java 程式、利用 FTP 傳送檔案、...等。如果需要進行的任務剛好有 Ant Task 可以用,那 Groovy + AntBuilder 就可以讓你少寫大量的 code。

例如,我最近需要用 Groovy 存取遠端的 SVN Repository,如果不考慮直接用 shell 執行 svn 指令(若這麼做就不夠 pure java 了),一般的作法是自行參考 SVNKIT 這個 library;但是,身為想要準時收工下班的開發人員,光是看到 SVNKIT 的 architecture diagram 頭就暈了。

所以我先找到 svnant 這個 SVN Ant Task,它可以用 Ant 的 build.xml 定義 svn 版本控制系統的操作。範例:

 <svn username="guest" password="">  
  <checkout url="http://subclipse.tigris.org/svn/subclipse/trunk/svnant/" revision="HEAD" destPath="svnant" />  
 </svn>  

不過,這畢竟是 XML 的寫法,不容易整合到程式裡面(如果要用 shell 去跑 ant 就等於多繞了一圈,不如直接跑 svn 指令)。

所以,我考慮用 Groovy + AntBuilder 來解決,測試之後相當順利。

@GrabConfig(systemClassLoader=true)
@GrabResolver(name='monkproject', root='http://www.monkproject.org/maven2/')
@Grab(group='org.tmatesoft.svnkit', module='svnkit', version='1.3.5')
@Grab(group='org.tmatesoft.svnkit', module='svnkit-javahl', version='1.3.5')
@Grab(group='org.monkproject', module='svnant', version='1.1.0-rc2')
@Grab(group='org.monkproject', module='svnClientAdapter', version='1.1.0-rc2')
def ant = new AntBuilder()
ant.typedef(resource: 'org/tigris/subversion/svnant/svnantlib.xml')
ant.svn(username: 'guest', password: 'password') {
    checkout(url: 'http://svn.apache.org/repos/asf/spamassassin/trunk', destPath: './test-svn')
}

這支程式用到了 svnant + svnClientAdapter + svnkit + svnkit-javahl 四個套件,所以前面的 @Grab 動作都是為了取得這些 .jar 套件檔案。其中 svnant + svnClientAdapter 好死不死 Grab 預設的 maven2 repository 並沒有提供,所以借來了 monkproject 這個專案的 maven2 網址暫時擋一下。

若把 @Grab 相關的 @Annotation 拿掉,其實真正的程式碼不過才 5 行而已,誰說 Java 程式一定要寫得落落長呢?趕快來玩 Groovy 吧... Groovy Taiwan 歡迎您!

沒有留言:

張貼留言

lyhcode by lyhcode
歡迎轉載,請務必註明出處!