Java 将带有公共配置的gradle插件应用于所有项目

Java 将带有公共配置的gradle插件应用于所有项目,java,gradle,build.gradle,artifactory,Java,Gradle,Build.gradle,Artifactory,我有一个包含多个无关gradle项目的工作区。我正在寻找一种方法,用一个公共配置将artifactory插件应用于所有这些插件 到目前为止,我尝试创建这个通用的gradle文件,并使用apply from将其应用到每个项目(顶层,而不是模块): buildscript { repositories { maven { url 'http://artifactory.mycompany.com/artifactory/plugins-release'

我有一个包含多个无关gradle项目的工作区。我正在寻找一种方法,用一个公共配置将artifactory插件应用于所有这些插件

到目前为止,我尝试创建这个通用的gradle文件,并使用
apply from
将其应用到每个项目(顶层,而不是模块):

buildscript {
  repositories {
    maven {
            url 'http://artifactory.mycompany.com/artifactory/plugins-release'    
        } 
    }

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

}


if (!project.plugins.findPlugin("com.jfrog.artifactory"))
  project.apply(plugin: "com.jfrog.artifactory")

artifactory {
    contextUrl = "${artifactory_contextUrl}"
    publish {
        repository {
            repoKey = 'libs-release-local'
            maven = true
        }
    }
    resolve {
        repository {
            repoKey = 'libs-release'
            maven = true
        }
    }
}
但我在构建时遇到以下错误:

A problem occurred evaluating script.
> Failed to apply plugin [id 'com.jfrog.artifactory']
   > Plugin with id 'com.jfrog.artifactory' not found.

如何使此方案工作?

据我所知,为无关项目注入公共配置的最佳方法是使用。您可以在其中配置常见行为,包括应用Artifactory插件。

我终于让它工作了

如前所述,实现这一点的“正确”方法可能是使用init脚本。问题是Gradle(在我的例子中是2.6版)不能在init脚本中通过id添加插件。这是(至少)从2012年6月就知道的一个bug(请参阅)。多亏了我,我找到了它

话虽如此,由于artifactory插件本身的变化,OP 2013年的解决方案(发布在文章中)不再有效。具体来说,插件的完全限定名不再是org.jfrog.gradle.plugin.artifactory.ArtifactoryPlugin。gradle 2现在有两个插件(版本3.1.1):

org.jfrog.gradle.plugin.artifactory.ArtifactoryPublicationsGradle2Plugin
org.jfrog.gradle.plugin.artifactory.ArtifactoryConfigurationsGradle2Plugin

下面是一个工作的init脚本:

initscript{
存储库{
jcenter()
}
依赖关系{
类路径'org.jfrog.buildinfo:buildinfo提取器gradle:3.1.1'
}
}
所有项目{
apply plugin:org.jfrog.gradle.plugin.artifactory.ArtifactoryConfigurationsGradle2Plugin//注意缺少引号
apply plugin:org.jfrog.gradle.plugin.artifactory.ArtifactoryPublicationsGradle2Plugin//注意缺少引号
人工制品{
contextUrl=“${artifactory\u contextUrl}”
发表{
存储库{
repoKey='libs release local'
username=“${artifactory\u user}”
password=“${artifactory\u password}”
maven=true
}
}
决心{
存储库{
repoKey='libs release'
username=“${artifactory\u user}”
password=“${artifactory\u password}”
maven=true
}
}
}   
}
编辑:

另一个更简单的解决方案是完全删除artifactory插件,并将其替换为
maven publish
。像这样:

所有项目{
应用插件:“maven发布”
出版{
存储库{
马文{
url“${artifactory_contextUrl}/”+(version.contains('SNAPSHOT')?'libs SNAPSHOT local':'libs release local')
证书{
用户名“${artifactory\u user}”
密码“${artifactory\u password}”
}
}
}
}
存储库{
mavenLocal()
马文{
url“${artifactory\u contextUrl}/libs release”
证书{
用户名“${artifactory\u user}”
密码“${artifactory\u password}”
}
}
马文{
url“${artifactory\u contextUrl}/libs快照”
证书{
用户名“${artifactory\u user}”
密码“${artifactory\u password}”
}
}
}
} 

buildscript必须在多模块项目的根build.gradle文件中定义。子项目中的构建脚本块将被忽略。这可能是导致插件找不到的原因。@BenManes Gretty(gradle的tomcat/jetty插件)似乎成功地做到了这一点,但在我的情况下它不起作用。下面是他们的“入门”指南:他们建议在build.gradle中添加“apply from:”,以获得插件是的,但这必须应用于根项目,而不是子项目。我不确定这是否是你的问题,但这听起来像是用户在设置我的插件时报告的错误。特别是这让我想起了@BenManes是的,这看起来确实很相似,但是我尝试应用它的项目是一个完全独立的java项目,也可能是一个gradle“HelloWorld”。这不是一个多项目构建的模块。听起来不错,但我仍然无法让它工作。我在initscript中定义了jcenter存储库和org.jfrog.buildinfo:build-info提取器gradle类路径,但在尝试应用插件时,我得到了一个“未找到id为'com.jfrog.artifactory'的插件”。你能给我举一个有效的例子吗?好吧,我发现问题是你不能在初始化脚本中通过插件的id添加插件(请看这个答案:)。@JBaruch init scripts只是解决方案的一部分,因为在初始化脚本中加载外部插件很棘手,如果插件的类名在未来版本中进行更改。我还在等着看是否有人能想出一个更干净的方法来做这件事。