Gradle artifactory插件说“无法投射对象'org.jfrog.gradle.plugin.artifactory.dsl.ArtifactoryPluginConvention'......”

时间:2015-04-22 19:59:21

标签: gradle artifactory

以下是获取artifactory插件的配置:

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...

我跑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。同样的一切。

我很困惑......

7 个答案:

答案 0 :(得分:20)

问题在于,当我向兄弟项目添加各种位时,这意味着我有两个项目定义了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'
    }
}

答案 1 :(得分:5)

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

因此,当使用Jenkins artifactory插件使用gradle artifactory插件构建gradle项目时,必须添加usesPlugin或jenkins插件将生成一个init脚本,该脚本将gradle插件添加到类加载器。

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

我的问题是,桌面构建好了,jenkins构建显示了这个帖子的问题

答案 2 :(得分:3)

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

Jenkins Build Error

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

Flag to fix issue

这解决了我的问题。希望它有所帮助。

答案 3 :(得分:2)

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

我的修复方法是将buildscript块和依赖项放在顶层build.gradle 将它放在每个子项目build.gradle文件中需要。

我猜这个工作的原因是插件被加载到父类加载器中,然后每个子项目继承该类加载器,这样下级子脚本中的声明使用了该类加载器类,而CCE也是如此。不会发生。问题是它们是同一个类,但不能分配,因为如果在顶部没有声明任何内容,则每个子项目的不同类加载器。这是Gradle 2.4,并使用IntelliJ 14。

答案 4 :(得分:1)

如果它对某人有帮助,我会得到同样的错误,但原因不同。

我的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.+"
}

答案 5 :(得分:0)

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

答案 6 :(得分:0)

我被竹子抛出了同样的异常:

'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上重新构建了该项目,但异常消失了。