Почему я получаю исключение UnknownPluginException при попытке использовать пользовательский подключаемый модуль компилятора Kotlin в Gradle?

Я создал собственный плагин компилятора Kotlin для Gradle. Он был вдохновлен kotlin-allopen (2) и sample-kotlin-compiler-plugin и должен сделать все классы Kotlin нефинальными.

Проблема в том, что я не могу использовать его в своих проектах, я получаю только следующее:

Caused by: org.gradle.api.plugins.UnknownPluginException: Plugin with id 'no.synth.kotlin.plugins.kotlin-really-allopen' not found.
    at org.gradle.api.internal.plugins.DefaultPluginManager.apply(DefaultPluginManager.java:131)

Я пробовал как "новый" синтаксис плагина:

plugins {
  id "no.synth.kotlin.plugins.kotlin-really-allopen" version "0.1"
}

.. и старый:

buildscript {
  repositories {
    mavenLocal()
  }
  dependencies {
    classpath "no.synth.kotlin.plugins:kotlin-really-allopen:0.1" 
  }
}

apply plugin: "kotlin-really-allopen" // I've tried "no.synth.kotlin.plugins.kotlin-really-allopen" as well

Так что я делаю неправильно? Вот плагин: https://github.com/henrik242/kotlin-really-allopen

РЕДАКТИРОВАТЬ: я обновил репозиторий примером приложения и файлом README.md, чтобы легко воспроизвести проблему.


person neu242    schedule 25.04.2019    source источник
comment
где он у вас развернут? mavenLocal()? или частный репозиторий nexus? или к gradlePluginsPortal?   -  person snowe    schedule 25.04.2019
comment
Я развернул его на mavenLocal. Gradle находит его, потому что раньше он терпит неудачу, если я добавляю опечатку в определение classcast.   -  person neu242    schedule 26.04.2019


Ответы (2)


Ваш плагин Gradle, похоже, не содержит записи в разделе META-INF/gradle-plugins.

Gradle требует, чтобы каждый идентификатор плагина был сопоставлен с классом реализации, и это сопоставление хранится в META-INF/gradle-plugins ресурсах.

Чтобы сопоставить идентификатор плагина kotlin-really-allopen, вам понадобится файл ресурсов src/main/resources/META-INF/gradle-plugins/kotlin-really-allopen.properties.

См. раздел Подключение пользовательского подключаемого модуля.

Вы также можете использовать плагин разработки плагинов Gradle, который автоматически создает эти записи из скрипт сборки DSL.


Кроме того, ваш репозиторий, похоже, не содержит реальной реализации плагина Gradle, есть только та часть, которую необходимо загрузить компилятору. Пример, который также содержит часть Gradle, см. в kevinmost/debuglog.

person hotkey    schedule 26.04.2019
comment
Я просмотрел содержимое jar плагина kotlin-allopen, и в нем нет META-INF/gradle-plugins. Есть идеи, почему это работает? Ссылка mvnrepository.com/artifact/org.jetbrains.kotlin/kotlin- всеоткрыть/ - person neu242; 26.04.2019
comment
@neu242, я только что скачал JAR, и в нем действительно есть META-INF/gradle-plugins с четырьмя записями: kotlin-allopen.properties, kotlin-spring.properties, org.jetbrains.kotlin.plugin.allopen.properties, org.jetbrains.kotlin.plugin.spring.properties. - person hotkey; 26.04.2019
comment
@neu242, кстати, источник этого модуля находится здесь: github.com/JetBrains/kotlin/tree/master/libraries/tools/ - person hotkey; 26.04.2019
comment
Вау, спасибо! Действительно ценится. У меня каким-то образом была локальная банка без этих записей, вероятно, из-за того, что я пытался построить из plugins/allopen (не libraries/tools/kotlin-allopen). - person neu242; 26.04.2019
comment
Вы также не смогли проверить свой mavenLocal. Вы можете увидеть pr, который я сделал в вашем репо, чтобы увидеть, как это сделать. github.com/henrik242/kotlin-really-allopen/pull/1/ файлы - person snowe; 27.04.2019

Переместите apply plugin: "kotlin-really-allopen" в приложение модуля build.gradle сверху

person coroutineDispatcher    schedule 25.04.2019
comment
Кажется, это не работает. У меня он находится точно в том же месте, где раньше был плагин kotlin-allopen - person neu242; 25.04.2019
comment
Я обновил репозиторий примером приложения и файлом README.md, чтобы легко воспроизвести проблему. Хочешь взглянуть? :) - person neu242; 26.04.2019