3
2

More than 5 years have passed since last update.

Gradleのプラグインへの引数を-Dプロパティで渡すと型違反するので型を気にせず値を渡せるようにする方法

Posted at

grettyに渡す引数を、以下のように渡したかった。

./gradlew appRun -Dgretty.port=8080 -Dgretty.xxx=xxxx

ほんで、以下のようにSystem.propertiesを回す。

System.properties.findAll { it.key.indexOf('gretty.')==0 }.collect{
  new MapEntry("${it.key.replaceFirst('^gretty\\.','')}",it.value)
}.each{
  gretty[it.key]=it.value
}

なぜだか、portの引数でCast出来ない例外が発生して(゚Д゚)ハァ?ってなった。
(ちなみに、Groovyコンソール上だと、Integer型の引数を受けるpropertyにString型のオブジェクトを突っ込んでも、Cast出来ない例外は発生しない)

とりあえず、以下の様なことを試してみる。

class Dog{
  int age = 1
  String name = 'taro'
  boolean isMale = true
  Integer id = 1
  void setName(String name){
     this.name = name.toLowerCase()
  }
  void setId(Integer id){
     if(id == null || id < 0){
        throw new Exception('bad id')
     }
     this.id = id
  }
  String toString(){
    "{$name:{'age':$age,'sex':'${isMale?'m':'f'}'}}"
  }
}
def setPropValue(target,kv){
  try{
    def setter="set${kv.key.replaceFirst('^(.)'){it[1].toUpperCase()}}"
    target.class.methods.each{
      if(it.name == setter && it.parameterTypes.length == 1){
        if(it.parameterTypes[0].isPrimitive() ||
           it.parameterTypes[0].methods.find {
             it.name=='valueOf' &&  it.parameterTypes.length == 1
           } &&
           it.parameterTypes[0] != String.class
        ){
          println "p : $kv.key"
          target[kv.key]=Eval.me(kv.value)
        }else{
          println "o : $kv.key"
          target[kv.key]=kv.value
        }
      }
    }
  }
  catch(e){println e}
}

def dog=new Dog()
['gretty.id':'2','gretty.name':'Hanako','gretty.isMale':'false','gretty.age':'2'].
collect{
  new MapEntry("${it.key.replaceFirst('^gretty\\.','')}",it.value)
}.each{
  setPropValue(dog,it)
}

うまいこと値を放り込めそう。

上の関数をそのまま使って、

def setPropValue(target,kv){
  try{
    def setter="set${kv.key.replaceFirst('^(.)'){it[1].toUpperCase()}}"
    target.class.methods.each{
      if(it.name == setter && it.parameterTypes.length == 1){
        if(it.parameterTypes[0].isPrimitive() ||
           it.parameterTypes[0].methods.find {
             it.name=='valueOf' &&  it.parameterTypes.length == 1
           } &&
           it.parameterTypes[0] != String.class
        ){
          println "p : $kv.key"
          target[kv.key]=Eval.me(kv.value)
        }else{
          println "o : $kv.key"
          target[kv.key]=kv.value
        }
      }
    }
  }
  catch(e){println e}
}
System.properties.findAll { it.key.indexOf('gretty.')==0 }.collect{
  new MapEntry("${it.key.replaceFirst('^gretty\\.','')}",it.value)
}.each{
  setPropValue(gretty,it)
}

とする。

これで./gradlewにGrettyの設定を指定することができるようになった。

実際にはデフォルトの設定が上につらつら書いてあります。

Jenkinsにintegration testさせているとき、project毎にportを変更したりできるので便利です。

3
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2