编写一个对多个插件做出反应的Gradle插件

编写一个对多个插件做出反应的Gradle插件,gradle,plugins,kotlin,build.gradle,gradle-plugin,Gradle,Plugins,Kotlin,Build.gradle,Gradle Plugin,我正在尝试编写一个新的Gradle插件,它需要应用两个插件:要么java,要么java-library,要么maven-publish。我正在用Kotlin编写插件 我可以很容易地按照以下步骤使插件对单个插件应用程序作出反应: project.plugins.withType(MavenPublishPlugin::class.java) { // My stuff } 但对于需要两个插件应用程序的情况,我不能这样做: project.plugins.withType(JavaPlug

我正在尝试编写一个新的Gradle插件,它需要应用两个插件:要么
java
,要么
java-library
,要么
maven-publish
。我正在用Kotlin编写插件

我可以很容易地按照以下步骤使插件对单个插件应用程序作出反应:

project.plugins.withType(MavenPublishPlugin::class.java) {
    // My stuff
}
但对于需要两个插件应用程序的情况,我不能这样做:

project.plugins.withType(JavaPlugin::class.java) {
    project.plugins.withType(MavenPublishPlugin::class.java) {
        // My stuff
    }
}
在第二种情况下,通过以下方式启动:

案例1:如预期的那样 按预期运行插件

案例2:未应用,如预期 使用:

plugins {
    id("java")
    id("org.danilopianini.publish-on-central")
}
未按预期应用插件

案例3:已应用,但不应 但是,最后:

plugins {
    id("maven-publish")
    id("org.danilopianini.publish-on-central")
}
尝试应用插件,但因以下原因失败:

FAILURE: Build failed with an exception.

* Where:
Build file '/tmp/junit876726632157783854/build.gradle.kts' line: 1

* What went wrong:
An exception occurred applying plugin request [id: 'org.danilopianini.publish-on-central']
> Failed to apply plugin [id 'org.danilopianini.publish-on-central']
   > SoftwareComponentInternal with name 'java' not found.

* Try:
Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Exception is:
org.gradle.api.plugins.InvalidPluginException: An exception occurred applying plugin request [id: 'org.danilopianini.publish-on-central']
[cut]
Caused by: org.gradle.api.internal.plugins.PluginApplicationException: Failed to apply plugin [id 'org.danilopianini.publish-on-central']
    ... 128 more
Caused by: org.gradle.api.UnknownDomainObjectException: SoftwareComponentInternal with name 'java' not found.
    at org.gradle.api.internal.DefaultNamedDomainObjectCollection.createNotFoundException(DefaultNamedDomainObjectCollection.java:489)
    at org.gradle.api.internal.DefaultNamedDomainObjectCollection.getByName(DefaultNamedDomainObjectCollection.java:323)

在我看来,这是一种尝试应用插件,而不管Java插件没有被应用

你知道如何配置一个插件来应对多个插件应用程序吗

FAILURE: Build failed with an exception.

* Where:
Build file '/tmp/junit876726632157783854/build.gradle.kts' line: 1

* What went wrong:
An exception occurred applying plugin request [id: 'org.danilopianini.publish-on-central']
> Failed to apply plugin [id 'org.danilopianini.publish-on-central']
   > SoftwareComponentInternal with name 'java' not found.

* Try:
Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Exception is:
org.gradle.api.plugins.InvalidPluginException: An exception occurred applying plugin request [id: 'org.danilopianini.publish-on-central']
[cut]
Caused by: org.gradle.api.internal.plugins.PluginApplicationException: Failed to apply plugin [id 'org.danilopianini.publish-on-central']
    ... 128 more
Caused by: org.gradle.api.UnknownDomainObjectException: SoftwareComponentInternal with name 'java' not found.
    at org.gradle.api.internal.DefaultNamedDomainObjectCollection.createNotFoundException(DefaultNamedDomainObjectCollection.java:489)
    at org.gradle.api.internal.DefaultNamedDomainObjectCollection.getByName(DefaultNamedDomainObjectCollection.java:323)