2017-01-03 20 views
0

を使用してgradleプラグインを書き込もうとしています。このように動作するはずです。設定は、gradleプラグイン拡張のインスタンスを作成できませんでした

apply plugin: 'appenv' 

app { 
    srcLink "" 
    downloadPath "" 
} 

を提供しながら、それは私が

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

プラグインクラスを作成して拡張クラスに

open class ApplicationEnvironmentExtension { 
    val project: Any? 

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

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

を作成したタスクdownloadAll

を使用してdownloadPathsrcLinkし、ストアからファイルをダウンロードできるようにする必要がありますそしてここに彼のt彼は私がそれを構築し、私のプロジェクトにjar依存関係として追加

class Download : DefaultTask() { 

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

タスク。 タスクが追加されたかどうかを確認するには、私はgradle tasksを実行します。しかし、その時に、私は私が

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  

問題は何である

を取得し、エラースタックトレースで

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

を取得しますか?拡張のためにいくつかの追加コンストラクタを提供する必要がありますか?

答えて

4

拡張機能には、デフォルト(引数なし)のコンストラクタが必要です。拡張機能の値にフィールドを割り当てる必要が本当にある場合は、lateinit varを使用して、プラグインに拡張機能を作成した後に割り当てることができます。

この場合は、とにかくprojectフィールドが必要なようには見えないので、そのフィールドとコンストラクタを取り除くことができます。それ以外の場合は、フィールドが必要な場合でもコンストラクタを削除しますが、というデフォルト値のprojectをvarにする必要があります。

+0

Cool。できます。 – lapots

関連する問題