自定义插件扩展中的嵌套对象
Nested object inside custom plugin extension
我正在开发自定义 Gradle 插件,我想像这样定义一个配置闭包(插件扩展):
myplugin {
property1 'value'
property2 {
a1 'hello'
a2 'bye'
}
}
我有这个 classes:
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);
但是在我的客户端项目中,当我像上面显示的那样应用和配置插件时,我得到了这个错误:
Gradle DSL method not found: 'property2()'
如何在 MyPluginExtension
class 中定义 property2
闭包?
编辑
我试过这个:
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()
它无法解析嵌套的闭包字段。
您需要使用 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
另请查看 why additional methods are needed. And here 您可以找到在 java 中实现的工作演示。
我正在开发自定义 Gradle 插件,我想像这样定义一个配置闭包(插件扩展):
myplugin {
property1 'value'
property2 {
a1 'hello'
a2 'bye'
}
}
我有这个 classes:
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);
但是在我的客户端项目中,当我像上面显示的那样应用和配置插件时,我得到了这个错误:
Gradle DSL method not found: 'property2()'
如何在 MyPluginExtension
class 中定义 property2
闭包?
编辑
我试过这个:
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()
它无法解析嵌套的闭包字段。
您需要使用 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
另请查看