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

标签 gradle kotlin

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

apply plugin: 'appenv'

app {
    srcLink ""
    downloadPath ""
}

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

我创建了扩展类

open class ApplicationEnvironmentExtension {
    val project: Any?

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

    var srcLink: String = ""
    var downloadPath: String = ""
}

创建插件类

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")
    }
}

这就是他的任务

class Download : DefaultTask() {

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

我构建它并将其添加为 jar对我的项目的依赖。 要检查任务是否已添加,我运行 gradle tasks 。但在此期间我收到错误

Could not create an instance of type com.lapots.gradle.plugins.appenv.ApplicationEnvironmentExtension_Decorated.

在堆栈跟踪中我得到

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    

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

最佳答案

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

在这种情况下,无论如何,您似乎都不需要 project 字段,因此您可以摆脱它和构造函数。否则,如果您确实需要该字段,仍然删除构造函数,但您需要将 project 设为默认值为 null 的 var。

关于gradle - 无法创建 gradle 插件扩展的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41441913/

相关文章:

导入模块构建时出现 Android 错误,gradle - 找不到方法 instrumentTestCompile()

android studio按钮可见性

android - 更新到 Android Studio,现在收到 AAPT : error: resource attr/type not found error for Navigation

java - 使用 SBT 将 Artifact 发布到本地 Maven 仓库并在 ​​Gradle 项目中使用它

java - 使用 gradle 处理 asm 依赖项时出现 NoClassDefFoundError

kotlin - "Leaking ' 这个 ' in constructor"警告应该适用于 final类和开放类(class)吗?

java - 如何在 Kotlin 中创建匿名接口(interface)的实例?

eclipse - 如何仅将一组Systemproperties传递给一个特定的测试用例,而不是全部传递给Gradle测试

kotlin - 检查集合是否只有一个元素的好方法

kotlin - Corda:在单个事务中添加多个输出状态