已在类路径上的插件的插件请求不得包含版本

Ale*_*nov 6 java android gradle

我已经对“类路径上已有的插件的插件请求不得包含版本站点:stackoverflow.com”进行了网络搜索,但没有发现任何特别的东西。搜索“已在类路径上的插件的插件请求不得包含版本”(不带 SO)找到:https : //discuss.gradle.org/t/error-plugin-already-on-the-classpath-must -not-include-a-version/31814我读过的答案,例如:

我在 Grade 插件文档中没有找到对这个用例的任何参考。

错误

构建文件 '/Users/username/github/OpCon/app/build.gradle' 行:4 解析插件时出错 [id:'com.android.application',版本:'3.4.1']

已在类路径上的插件的插件请求不得包含版本

出现在IntelliJ IDEA,build.gradle(OpCon)中:

buildscript {
    repositories {
        jcenter()
        maven {
            url 'https://maven.google.com/'
            name 'Google'
        }
        google()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.5.2'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        mavenCentral()
        maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
    }
    repositories {
        jcenter()
        maven {
            url 'https://maven.google.com/'
            name 'Google'
        }
    }
}
task clean(type: Delete) {
    delete rootProject.buildDir
}
Run Code Online (Sandbox Code Playgroud)

app/build.gradle

plugins {
    id 'com.android.application' version '3.4.1' apply true
}

... and then other stuff
Run Code Online (Sandbox Code Playgroud)

我不明白,类路径 'com.android.tools.build:gradle:3.5.2' 似乎不包括 'com.android.application'...如果在项目中搜索,“classpath”只有一次出现。

添加:

有趣的是在https://maven.google.com/web/index.html 上我可以找到 'com.android.tools.build:gradle:3.5.2' 但没有 'com.android.application' 分支。

添加 2:我已经通过从这里获取的命令下载(由于某种原因实际上下载了很多文件)如何在一个命令行中下载特定的 Maven 工件?

mvn org.apache.maven.plugins:maven-dependency-plugin:2.8:get -DrepoUrl='https://maven.google.com/' -Dartifact='com.android.tools.build:gradle:3.4.1'

com.android.tools.build:gradle在文件管理器中找到路径,并在那里只查看 jar:

username$ jar tvf /Users/username/.m2/repository/com/android/tools/build/gradle/3.4.1/gradle-3.4.1.jar | grep application
  1115 Wed May 01 20:30:18 MSK 2019 com/android/build/gradle/internal/tasks/ApplicationIdWriterTask$applicationIdSupplier$1.class
    55 Wed May 01 20:29:18 MSK 2019 META-INF/gradle-plugins/com.android.application.properties
Run Code Online (Sandbox Code Playgroud)

所以gradle plugin com.android.application在 jar 中有一个提及META-INF

文件com.android.application.properties是一个班轮:implementation-class=com.android.build.gradle.AppPlugin.

Web 搜索“实现类 java”可找到有关接口的信息。在维基https://en.wikipedia.org/wiki/Interface_(Java) 中

Java 编程语言中的接口是一种抽象类型,用于指定类必须实现的行为。

那么gradle插件可以是一个接口吗?我怎样才能进一步挖掘?

Ner*_*rve 15

Gradle 不允许在类路径上存在多个版本的插件。因此,如果您有一个多模块构建,则可能有多个模块声明了具有不同版本的相同插件。

要解决此问题,您需要在一个地方指定一个版本,即 settings.gradle

例如,您将以下内容放入 settings.gradle

pluginManagement {
  plugins {
    id 'org.springframework.boot' version "2.3.3.RELEASE"
    id 'io.spring.dependency-management' version '1.0.10.RELEASE'
  }
}
Run Code Online (Sandbox Code Playgroud)

然后在单个模块 gradle 文件中,您将执行以下操作(未提及版本)

plugins {
  id 'org.springframework.boot'
  id 'io.spring.dependency-management'
}
Run Code Online (Sandbox Code Playgroud)

仅供记录,问题中提到的错误也可能与此消息一起显示

插件在不同的子项目中多次加载,不受支持,可能会破坏构建


nol*_*man 8

对我来说,在项目级别有这个就足够了,build.gradle无需提及版本:

plugins {
    alias(libs.plugins.android.application) apply false
    alias(libs.plugins.android.library) apply false
    alias(libs.plugins.kapt) apply false
    alias(libs.plugins.parcelize) apply false
    alias(libs.plugins.kotlin) apply false
    alias(libs.plugins.navigation) apply false
    alias(libs.plugins.sonarqube) apply false
    alias(libs.plugins.google.services) apply false
    alias(libs.plugins.crashlytics) apply false
}
Run Code Online (Sandbox Code Playgroud)

然后在每个模块级别build.gradle都有您要应用的插件:

plugins {
    alias(libs.plugins.android.application)
    alias(libs.plugins.kotlin)
    alias(libs.plugins.kapt)
    alias(libs.plugins.parcelize)
    alias(libs.plugins.realm)
    alias(libs.plugins.navigation)
    alias(libs.plugins.google.services)
    alias(libs.plugins.crashlytics)
}
Run Code Online (Sandbox Code Playgroud)

请注意,我正在使用 Gradle 版本目录


小智 5

我遇到了同样的问题,我使用的是带有插件的 spring boot,如下所示

plugins {
    id 'org.springframework.boot' version '2.2.0.RELEASE'
    id 'io.spring.dependency-management' version '1.0.8.RELEASE'
    id 'java'
    id 'war'
}
Run Code Online (Sandbox Code Playgroud)

由于此插件存在于一个依赖项中,因此 gradle 抱怨它。我只是删除了这些依赖项,它起作用了:

plugins {
    id 'java'
    id 'war'
}
Run Code Online (Sandbox Code Playgroud)