无法创建 gradle 插件扩展的实例

lap*_*ots 2 gradle kotlin

我正在尝试gradle使用kotlin. 它应该像这样工作。同时提供配置

apply plugin: 'appenv'

app {
    srcLink ""
    downloadPath ""
}
Run Code Online (Sandbox Code Playgroud)

它应该允许从使用任务下载文件srcLink并存储在downloadPathdownloadAll

我创建了扩展类

open class ApplicationEnvironmentExtension {
    val project: Any?

    constructor(project: Any?) {
        this.project = project
    }

    var srcLink: String = ""
    var downloadPath: String = ""
}
Run Code Online (Sandbox Code Playgroud)

创建插件类

class ApplicationEnvironmentPlugin : Plugin<Project> {

    override fun apply(project: Project) {
        project.extensions.create("app", ApplicationEnvironmentExtension::class.java)
        project.task(mapOf ("type" to Download::class.java), "downloadAll")
    }
}
Run Code Online (Sandbox Code Playgroud)

这是他的任务

class Download : DefaultTask() {

    @TaskAction
    fun download() {
        val extension = this.project.extensions.getByName("app") as ApplicationEnvironmentExtension
        DownloadUtils.download(extension.srcLink, extension.downloadPath)
    }
}
Run Code Online (Sandbox Code Playgroud)

我构建它并将其作为jar依赖项添加到我的项目中。要检查是否添加了任务,我运行gradle tasks. 但在那期间我得到了错误

Could not create an instance of type com.lapots.gradle.plugins.appenv.ApplicationEnvironmentExtension_Decorated.
Run Code Online (Sandbox Code Playgroud)

在堆栈跟踪中我得到

Caused by: org.gradle.internal.reflect.ObjectInstantiationException: Could not create an instance of type com.lapots.gradle.plugins.appenv.ApplicationEnvironmentExtension_Decorated.
        at org.gradle.internal.reflect.DirectInstantiator.newInstance(DirectInstantiator.java:53)
        at org.gradle.api.internal.ClassGeneratorBackedInstantiator.newInstance(ClassGeneratorBackedInstantiator.java:36)
        at org.gradle.api.internal.plugins.DefaultConvention.create(DefaultConvention.java:106)
        at com.lapots.gradle.plugins.appenv.ApplicationEnvironmentPlugin.apply(ApplicationEnvironmentPlugin.kt:11)
        at com.lapots.gradle.plugins.appenv.ApplicationEnvironmentPlugin.apply(ApplicationEnvironmentPlugin.kt:8)
        at org.gradle.api.internal.plugins.ImperativeOnlyPluginApplicator.applyImperative(ImperativeOnlyPluginApplicator.java:35)
        at org.gradle.api.internal.plugins.RuleBasedPluginApplicator.applyImperative(RuleBasedPluginApplicator.java:43)
        at org.gradle.api.internal.plugins.DefaultPluginManager.doApply(DefaultPluginManager.java:144)
        ... 58 more         
Caused by: java.lang.IllegalArgumentException: Could not find any public constructor for class com.lapots.gradle.plugins.appenv.ApplicationEnvironmentExtension_Decorated which accepts parameters [].
        at org.gradle.internal.reflect.DirectInstantiator.newInstance(DirectInstantiator.java:44)
        ... 65 more    
Run Code Online (Sandbox Code Playgroud)

问题是什么?我应该为扩展提供一些额外的构造函数吗?

Jam*_*ett 5

扩展需要一个默认(无参数)构造函数。如果您确实需要为扩展中的值分配字段,则可以lateinit var在插件中创建扩展后使用并分配它。

在这种情况下,看起来您project无论如何都不需要您的字段,因此您可以摆脱它和构造函数。否则,如果您确实需要该字段,仍然删除构造函数,但您需要创建project一个默认值为null.