Ошибка: плагин java был применен, но он несовместим с плагинами Android

Я пытаюсь создать новую библиотеку, которая будет использоваться другими модулями в проектах. К сожалению, хотя, когда я пытаюсь создать его, я получаю указанную ошибку еще до того, как gradle будет построен:

The 'java' plugin has been applied, but it is not compatible with the Android plugins.

Вот мой градл:

apply plugin: 'com.android.library'

android {
    compileSdkVersion 27

    defaultConfig {
        minSdkVersion 19
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])

    implementation 'com.android.support:appcompat-v7:27.1.1'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
}

Я пробовал читать несколько похожих тем, в которых люди рекомендуют удалить плагин java, но я не вижу их в своей новой библиотеке. Однако я вижу плагин java в моем корневом градиенте:

configure(allprojects) {
  println "applying java plugin to $project"
  apply plugin: 'java-library'

  sourceSets {
    main {
      java {
        srcDirs = ["src"]
      }
      resources {
        srcDirs = ["src/resources"]
      }
    }
  }

  sourceCompatibility = 1.7
  targetCompatibility = 1.7
}

Как вы думаете, в чем может быть проблема?

У вас, вероятно, есть другие файлы Gradle в вашем проекте (в частности, в корне проекта); Кто-нибудь из них упоминает плагин Java?

stkent 25.04.2018 15:10

@stkent Да, это apply plugin: 'java-library', но я не могу это изменить, как мне решить эту проблему в текущей библиотеке?

waseefakhtar 25.04.2018 15:15

Где именно apply plugin: 'java-library'? В корневом файле build.gradle или в родственном файле build.gradle? Пожалуйста, добавьте код, который также показывает, как он вызывается. Спасибо!

stkent 25.04.2018 15:24

@stkent да, это в корне градиента. Просто обновите мой OP, чтобы вы его увидели.

waseefakhtar 25.04.2018 15:40
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
4
1 772
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Этот код:

configure(allprojects) {
  println "applying java plugin to $project"
  apply plugin: 'java-library'

  //...
}

заявляет, что подключаемый модуль библиотеки Java должен применяться к каждому проекту Gradle в вашей кодовой базе. Обратите внимание, что плагины java (приложение, библиотека) обычно несовместимы с плагинами android (приложение, библиотека). Вы можете думать о последних как о сильно модифицированных версиях первого.

Эта несовместимость вызывает ошибку, которую вы видите.

Лучшее разрешение зависит от целей вашей кодовой базы в целом и проектов Gradle в ней. Вероятны наименее инвазивные варианты:

  1. Удалите apply plugin: 'java-library' и связанную с ним конфигурацию из конфигурации allprojects и вместо этого вручную примените плагин в каждом проекте Gradle, который в нем нуждается;
  2. Добавьте особый случай в вашу конфигурацию allprojects, чтобы плагин java-library применялся ко всем проектам Кроме новый.

Чтобы расширить второй случай, вы можете сделать что-то вроде:

configure(allprojects) {
  if (getPath() != "absolute/path/to/new/project") {
    println "applying java plugin to $project"
    apply plugin: 'java-library'

    // ...
  }
}

Я использовал здесь getPath, поскольку уникальность getName в целом не гарантируется, но если это в вашем конкретном случае, то это было бы более удобным условием для записи и чтения.

Ты прав! Мне просто нужно было избавиться от плагина java в новой библиотеке. Я решил обойти это другим способом, которым поделюсь ниже. Спасибо!

waseefakhtar 25.04.2018 16:09

Как упоминает @stkent, нам просто нужно избавиться либо от плагина java, либо исключить библиотеку из конфигурации всех проектов в корневом градиенте. Я решил обойти это, добавив следующее в корневой градиент, к которому был применен плагин java:

configure(allprojects - project(':NewLibraryName')) {
    println "applying java plugin to $project"
    apply plugin: 'java-library'

    //...
}

Красивое, очень аккуратное решение!

stkent 25.04.2018 16:25

Другие вопросы по теме