Gradle中最干净的方法是获取gradle依赖项缓存中jar文件的路径

Ted*_*eid 34 dependencies hadoop jar gradle

我正在使用Gradle帮助自动执行Hadoop任务.在调用Hadoop时,我需要能够将路径传递给我的代码所依赖的一些jar,以便Hadoop可以在map/reduce阶段发送该依赖项.

我发现了一些有用的东西,但它感觉很乱,我想知道是否有某个功能我在某处丢失了.

这是我的gradle脚本的简化版本,它依赖于solr 3.5.0 jar,以及一个findSolrJar遍历配置中所有jar文件的任务,以找到正确的:

apply plugin: 'groovy'

repositories {
    mavenCentral()
}

dependencies {
    compile 'org.apache.solr:solr-solrj:3.5.0'
}

task findSolrJar() {
     println project.configurations.compile*.toURI().find { URI uri -> new File(uri).name == 'solr-solrj-3.5.0.jar'}
}
Run Code Online (Sandbox Code Playgroud)

运行这个给我这样的输出:

gradle findSolrJar                                                                                                                                                                                                                                                           
file:/Users/tnaleid/.gradle/caches/artifacts-8/filestore/org.apache.solr/solr-solrj/3.5.0/jar/74cd28347239b64fcfc8c67c540d7a7179c926de/solr-solrj-3.5.0.jar
:findSolrJar UP-TO-DATE

BUILD SUCCESSFUL

Total time: 2.248 secs
Run Code Online (Sandbox Code Playgroud)

有一个更好的方法吗?

Pet*_*ser 28

例如,您的代码可以简化一些project.configurations.compile.find { it.name.startsWith("solr-solrj-") }.


Tim*_*mur 25

您还可以为工件创建专用配置,以保持其清洁; 并且asPath如果它可以返回多个位置的事实适用于您的用例(如果它在几个位置解析相同的jar,则会发生):

configurations {
  solr
}

dependencies {
  solr 'org.apache.solr:solr-solrj:3.5.0'
}

task findSolrJars() {
  println configurations.solr.asPath
}
Run Code Online (Sandbox Code Playgroud)

为避免复制粘贴,如果您在compile配置中也需要该jar ,您可以将此专用配置添加到compile一个,例如:

dependencies {
  solr 'org.apache.solr:solr-solrj:3.5.0'
  compile configurations.solr.dependencies
}
Run Code Online (Sandbox Code Playgroud)