我正在尝试写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/