Gradle 神器插件说 "Cannot cast object 'org.jfrog.gradle.plugin.artifactory.dsl.ArtifactoryPluginConvention'..."

Gradle artifactory plugin saying "Cannot cast object 'org.jfrog.gradle.plugin.artifactory.dsl.ArtifactoryPluginConvention'..."

这是获取神器插件的配置:

buildscript {
    repositories {
        mavenCentral()
        maven { url 'http://jcenter.bintray.com' }
    }
    dependencies {
        classpath group:'org.jfrog.buildinfo', name: 'build-info-extractor-gradle', version: '3.0.1'
    }
}
apply plugin:'com.jfrog.artifactory'
apply plugin:'ivy-publish'

...some publish spec stuff...

I 运行 gradle (2.3) 我得到:

> Failed to apply plugin [id 'com.jfrog.artifactory']
   > Cannot cast object 'org.jfrog.gradle.plugin.artifactory.dsl.ArtifactoryPluginConvention@6b6c7be4' with class 'org.jfrog.gradle.plugin.artifactory.dsl.ArtifactoryPluginConvention' to class 'org.jfrog.gradle.plugin.artifactory.dsl.ArtifactoryPluginConvention'

当然看起来像是一个类路径问题,但我确实有这个项目和一个兄弟项目使用同一组 gradle/artifactory 配置,一个有效,另一个无效。两者都是同一个顶级项目的一部分。相同 JDK (1.8.0_20)。相同 Gradle。一切都一样。

我很困惑...

问题是,当我将各种位添加到兄弟项目时,这意味着我有两个项目定义了 buildscript {} 部分。

buildscript {
    ...
    dependencies {
        classpath group:'org.jfrog.buildinfo', name: 'build-info-extractor-gradle', version: '3.0.1'
    }
}

显然这导致类路径中存在两个不同版本的依赖项,因此出现错误。

解决方案是将 buildscript 位移动到主项目中,这样这些依赖项只定义一次:

buildscript {
    repositories {
        maven { url "https://plugins.gradle.org/m2/" }
    }
    dependencies {
        classpath group:'org.jfrog.buildinfo', name: 'build-info-extractor-gradle', version: '3.0.1'
    }
}

我遇到了类似的问题。 Gradle 似乎试图跨越兄弟姐妹并进行一些检查或评估。我有一个顶级 settings.gradle,其中包含 10 个左右的子项目。

我的解决方法是将 buildscript 块和依赖项放在顶层 build.gradle 把它放在每个单独的子项目 build.gradle 需要的文件。

我猜测这个工作的原因是插件被加载到将成为父 classloader 的父项目中,然后每个子项目继承 classloader 这样的声明在较低的子脚本中使用 classloaders class 并且 CCE 不会发生。问题是它们是相同的 class,但不可分配,因为如果顶部没有声明任何内容,每个子项目的加载器不同 class。这是 Gradle 2.4,使用的是 IntelliJ 14。

万一它对某人有帮助,我得到了同样的错误,但出于不同的原因。

我的 build.gradle 中有以下内容:

dependencies {
    classpath "org.jfrog.buildinfo:build-info-extractor-gradle:+"
}

在某些时候,artifactory 插件在构建时将自身从版本 3.x 更新为版本 4.x,因为没有为依赖项指定特定版本。更新后我收到错误 (Could not find any convention object of type ArtifactoryPluginConvention).

我猜问题是我的构建脚本中的其余配置不适用于新的插件版本。将依赖项设置为使用版本 3.x 为我解决了问题:

dependencies {
    classpath "org.jfrog.buildinfo:build-info-extractor-gradle:3.+"
}

我在使用 Jenkins 构建时遇到了类似的异常。对我来说,冲突与 Jenkin 的版本和构建脚本中的版本有关:

为了解决这个问题,构建的 Artifactory 部分有一个标志,您可以检查是否指定要使用 gradle 文件中的版本:

这解决了我的问题。希望对你有帮助。

这是另一个潜在原因。所有这些看起来都是定义 class 的竞争对手 classloader 的问题。完全限定的 classes 包括加载器。所以,负载 A foo.bar 不是负载 B foo.bar 并且跨越那个鸿沟是一个复杂的舞蹈,需要接口和仔细定义。

因此,当使用 Jenkins artifactory 插件构建带有 gradle artifactory 插件的 gradle 项目时,您必须添加 usesPlugin,否则 jenkins 插件将生成一个初始化脚本,其中添加 gradle 插件到 class 加载程序。

def server = Artifactory.server "artifactory"
def rtGradle = Artifactory.newGradleBuild()
rtGradle.usesPlugin = true // Artifactory plugin already defined in build script
...

我的问题是,桌面构建正常,jenkins 构建显示了这个 post 的问题

虽然当前接受的答案正确地确定了这个问题的原因,但当您仍然需要能够构建单个子项目时,建议的解决方案不起作用(因为他们当然不再有权访问定义的构建脚本存储库和依赖项)。对我有用的解决方案是在我的每个子项目中都有 相同的 buildscript 块,这似乎是关键。任何变化都会导致原始错误。

我遇到了 bamboo 抛出的相同异常:

'org.jfrog.gradle.plugin.artifactory.dsl.ArtifactoryPluginConvention@18eb2827' with class 'org.jfrog.gradle.plugin.artifactory.dsl.ArtifactoryPluginConvention' to class 'org.jfrog.gradle.plugin.artifactory.dsl.ArtifactoryPluginConvention'

由于 bamboo Bamboo Artifactory 插件默认在每个子项目模块中查找 gradle.propeties 文件,因此必须在那里提供。

不需要在build.gradle文件中发布逻辑,因为Bamboo Artifactory插件会分别读取每个模块的gradle.properties文件,包含:

group=com.example
artifactId=your-project
version=1.0.0

我抛出 ArtifactoryPluginConvention 异常的原因是我在 Bamboo 上配置的构建计划配置错误。

由于配置错误,任务的构建顺序不正确。看看您的 Bamboo 建筑 tasks/preferably 克隆一个已经在运行的 Bamboo 计划。