2015-11-09 238 views
2

我正在开发一个定制的摇篮插件,我想定义的配置闭合(插件扩展名)是这样的:嵌套对象

myplugin { 
    property1 'value' 

    property2 { 
    a1 'hello' 
    a2 'bye' 
    } 
} 

我有这个类:

public class MyPluginExtension { //root extension 

    String property1; 
    Property2 peroperty2; 

    //getters and setters 
} 

public class Property2 { 
    String a1; 
    String a2; 
    //getters and setters 
} 

而且,在插件项目中,我创建扩展这种方式:

project.getExtensions().create("myplugin", MyPluginExtension.class); 

但在我的客户项目,当我应用程式LY和配置如上所示的插件,我得到这个错误:

Gradle DSL method not found: 'property2()'

我如何定义我MyPluginExtensionproperty2关闭?

编辑

我已经试过这样:

public class MyPluginExtension { //root extension 

    String property1; 
    Property2 peroperty2; 

     //getters and setters 

    public void property2(Closure c) { 
     c.setResolveStrategy(Closure.DELEGATE_FIRST); 
     c.setDelegate(property2); 
     c.call(); 
    } 
} 

但现在我得到这个错误:

Gradle DSL method not found: a1()

它无法解决嵌套封场。

回答

3

你需要利用与委托设置为特定对象Closure

class SamplePlugin implements Plugin { 
    void apply(Object p) { 
     p.extensions.create("e", MyPluginExtension) 
    } 
} 

class MyPluginExtension { 

    Property2 property2 = new Property2() 
    String property1 

    def property2(Closure c) { 
     c.resolveStrategy = Closure.DELEGATE_FIRST 
     c.delegate = property2 
     c() 
    } 
} 

class Property2 { 
    String a1 
    String a2 

    def a1(a1) { 
     this.a1 = a1 
    } 

    def a2(a2) { 
     this.a2 = a2 
    } 
} 

apply plugin: SamplePlugin 

e { 
    property1 'lol' 
    property2 { 
     a1 'lol2' 
     a2 'lol3' 
    } 
} 

println e.property1 
println e.property2.a1 

也请看看here为什么需要额外的方法。和here你可以找到一个在java中实现的工作演示。

+0

谢谢。如果我使用Java而不是Groovy,那么呢? –

+0

只需使用java语法定义它。也应该工作。 – Opal

+0

谢谢。我试过了,似乎解决了,但现在它不能解决嵌套闭包字段。看看我的编辑。 –