以下是获取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。同样的一切。
我很困惑......
答案 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脚本中的版本:
为了解决这个问题,构建的Artifactory部分有一个标志,你可以检查你是否要使用gradle文件中的版本:
这解决了我的问题。希望它有所帮助。
答案 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上重新构建了该项目,但异常消失了。