gradle 对类路径上已有插件的插件请求不能包含版本

pw136qt2  于 2023-03-23  发布在  其他
关注(0)|答案(4)|浏览(143)

我已经做了网页搜索“插件请求插件已经在classpath必须不包括一个版本的网站:stackoverflow.com“,并没有发现什么特别的.搜索“插件请求插件已经在classpath必须不包括一个版本”(w/out 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.应用程序”,版本:'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
}

app/build.gradle

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

... and then other stuff

我不明白,classpath '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:我已经下载(相当多的文件实际上是下载了一些原因)从这里采取的命令How can I download a specific Maven artifact in one command line?
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

所以在jar META-INF中提到了gradle plugincom.android.application
文件com.android.application.properties是一行:implementation-class=com.android.build.gradle.AppPlugin .
在web上搜索“implementation class java”可以找到有关接口的信息。在wiki https://en.wikipedia.org/wiki/Interface_(Java)中:
Java编程语言中的接口是一种抽象类型,用于指定类必须实现的行为。
那么gradle插件可能是一个接口?我如何进一步挖掘?

xxslljrj

xxslljrj1#

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'
  }
}

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

plugins {
  id 'org.springframework.boot'
  id 'io.spring.dependency-management'
}

仅供记录,问题中提到的错误也可能会显示此消息
插件在不同的子项目中加载了多次,这不受支持,可能会破坏构建

j8yoct9x

j8yoct9x2#

我也遇到了同样的问题,我使用的是带有插件的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'
}

由于此插件存在于一个依赖项中,Gradle正在抱怨它。我简单地删除了这些依赖项,它工作了:

plugins {
    id 'java'
    id 'war'
}
csbfibhn

csbfibhn3#

使用apply false将配置放入根项目中的build.gradle

plugins {
    id 'org.springframework.boot' version "2.5.1" apply false
    id 'io.spring.dependency-management' version '1.0.11.RELEASE' apply false
}

然后你可以把它到处都没有版本

plugins {
    id 'org.springframework.boot'
    id 'io.spring.dependency-management'
}

更多信息:->Example 3. Applying plugins only on certain subprojects

bogh5gae

bogh5gae4#

对我来说,在项目级别的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
}

然后在每个模块级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)
}

请注意,我使用的是Gradle版本目录

相关问题