我正在为Gradle编写一个自定义插件.我希望能够:
serviceDependencies {
    service name: 'service1', version: '1.0'
    service name: 'service2', version: '1.1'
}
在我的插件实现中(用Java)我有:
public void apply(final Project project) {
    project.getExtensions().create("serviceDependencies", Services.class);
    project.getExtensions().create("service", Service.class);
}
和Service.java:
public class Service {
    private String name;
    private String version;
    public Service(final String name, final String version) {
        this.name = name;
        this.version = version;
    }
    public String getName() {
        return this.name;
    }
    public void setName(final String name) {
        this.name = name;
    }
    public String getVersion() {
        return this.version;
    }
    public void setVersion(final String version) {
        this.version = version;
    }
}
当我尝试使用这个插件时,我得到:
java.lang.IllegalArgumentException: Could not find any public constructor for class com.xxx.xxx.Service_Decorated which accepts parameters [].
当我从图片中删除serviceDependencies/Services.java时,仍然会发生这种情况.
如果我删除服务构造函数或删除参数.
org.gradle.internal.metaobject.AbstractDynamicObject$CustomMessageMissingMethodException: Could not find method service() for arguments [{name=service1, version=1.0}] on root project ... 
显然我的pojo正在装饰,但不完全正确的构造函数.如何在build.gradle脚本中让构造函数按照我的要求工作?
第二个独立的问题是Services.java应该是什么样的?
我只会注册一个扩展来serviceDependencies {}公开注册您的服务的功能:
public class Services {
  void service(String name, String version) { /* new Service(...) */ }
}
project.getExtensions().create("serviceDependencies", Services.class);
这将允许 Java、Kotlin 和 Groovy 消费者执行以下操作:
serviceDependencies {
  service 'service1', '1.0'
  service 'service2', '0.1'
}
然后,如果你想支持 Groovy 命名参数,你需要添加:
serviceDependencies {
  service 'service1', '1.0'
  service 'service2', '0.1'
}
这将允许 Groovy 消费者执行以下操作:
serviceDependencies {
  service name: 'service1', version: '1.0'
  service name: 'service2', version: '0.1'
}
| 归档时间: | 
 | 
| 查看次数: | 367 次 | 
| 最近记录: |