AntBuilderを使ってみる

ビルドには条件分岐をつかいたい。これに柔軟に対応するためにはbuild.xmlではなくGroovyのAntBuilderなのだ。(とはいっても作ったもののなかには条件分岐いれてない)きのうのbuild.xmlに似たものをつくってみた。

  • 気づいたこと&感想など
    • JAVA_HOMEをちゃんと設定してあるのに設定していないとおこられる。JDKのtools.jarにクラスパスを通せばいいみたい。
    • targetとかprojectの使い方がわからなかった。そのためtargetタスクのdepends属性が使えず。
    • とりあえずtarget単位でメソッドをつくった。動くけれどもっといい組み方があると思う。
    • 条件分岐やループなどをいれればもっと便利さがわかるだろう。
    • xmlに変換できるのか?実際に実行したときのxmlを生成できたらいいな。方法わからない。
    • AntBuilderのオブジェクトに対して普通のメソッド呼び出しがうまくいかない?たとえばtoString()を使っても「Could not convert tag」とか言われてしまう。どうするのか?
    • 途中で特定のExceptionがおきたときには違う処理とかできるのか?
builder = new MyBuilder(warname:"hoge.war", earname:"hogehoge.ear")
builder.compile()
builder.copy()
builder.warfile()
builder.earfile()

class MyBuilder {
  
  src = "src"
  build = "build"
  lib = "lib"
  dist = "dist"
  fromdir = "src"
  webapps = "webapps"
  warname = "sample.war"
  earname = "sample.ear"
  
  ant = new AntBuilder() 
  
  void compile() {
    ant.delete(dir:build)
    ant.mkdir(dir:build)
    ant.javac(srcdir:src, destdir:build) {
      classpath() {
        fileset(dir:lib) {
          include(name:"*")
          exclude(name:"x*")
        } 
      }
    }
  }


  void copy() {
    ant.copy(todir:build) {
      fileset(dir:fromdir) {
        include(name:"**/*.properties")
        include(name:"**/*.xml")
        exclude(name:"build.xml")
      }
    }
  }


  void warfile() {
    ant.delete(dir:dist)
    ant.mkdir(dir:dist)
    ant.war(destfile:"${dist}/${warname}", 
      webxml:"${webapps}/WEB-INF/web.xml") {
      
      webinf(dir:"${webapps}/WEB-INF") {
        exclude(name:"web.xml")
        include(name:"*")
      }
      classes(dir:build)
      lib(dir:lib) {
        fileset(dir:webapps) {
          exclude(name:"WEB-INF/**")
        }
      }
    }
  }


  void earfile() {
      ant.ear(earfile:"${dist}/${earname}", 
        appxml:"${lib}/application.xml") {
        
        fileset(dir:dist) {
          include(name:warname)
        }
      }
  }
}