首页 > 解决方案 > 错误:“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 插件,但在我的新库中没有看到任何内容。但是我确实在我的根 gradle 中看到了一个 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
}

你认为可能是什么问题?

标签: javaandroidgradleandroid-gradle-plugingradle-plugin

解决方案


这段代码:

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通常不能保证是唯一的,但是如果在您的特定情况下,那将是一个更友好的读写条件。


推荐阅读