Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gradle中获取Gradle依赖项缓存中jar文件路径的最干净方法_Jar_Hadoop_Dependencies_Gradle - Fatal编程技术网

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

Gradle中获取Gradle依赖项缓存中jar文件路径的最干净方法,jar,hadoop,dependencies,gradle,Jar,Hadoop,Dependencies,Gradle,我正在使用Gradle帮助自动化Hadoop任务。调用Hadoop时,我需要能够将路径传递给我的代码所依赖的一些JAR,以便Hadoop可以在map/reduce阶段发送依赖关系 我已经想出了一些可行的方法,但感觉很混乱,我想知道是否有一个功能我在某处遗漏了 这是我的gradle脚本的简化版本,它依赖于solr 3.5.0 jar,还有一个findSolrJar任务,它迭代配置中的所有jar文件以找到正确的jar文件: apply plugin: 'groovy' repositories {

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

我已经想出了一些可行的方法,但感觉很混乱,我想知道是否有一个功能我在某处遗漏了

这是我的gradle脚本的简化版本,它依赖于solr 3.5.0 jar,还有一个
findSolrJar
任务,它迭代配置中的所有jar文件以找到正确的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'}
}
运行此命令可以得到如下输出:

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
val patchModule = listOf(
        "--patch-module", "commons.logging=" +
        spec2File["org.slf4j:jcl-over-slf4j"].toString(),

        "--patch-module", "org.apache.commons.logging=" +
        spec2File["org.slf4j:jcl-over-slf4j"].toString()
)
patchModule.forEach({it -> println(it)})

tasks {
        withType<JavaCompile> {
            doFirst {
                options.compilerArgs.addAll(listOf(
                        "--release", "11",
                        "--module-path", classpath.asPath
                ) + patchModule)
                // println("Args for for ${name} are ${options.allCompilerArgs}")
            }
        }
}

有更好的方法吗?

您的代码可以简化一点,例如
project.configurations.compile.find{it.name.startsWith(“solr solrj-”)}
您还可以为工件创建一个专用配置,以保持其整洁;如果它可能返回多个位置这一事实对您的用例很有效(如果它在多个位置解析同一个jar,则会发生这种情况),则使用
asPath

为了避免复制粘贴,如果您还需要
compile
配置中的jar,您可以将此专用配置添加到
compile
配置中,如下所示:

dependencies {
  solr 'org.apache.solr:solr-solrj:3.5.0'
  compile configurations.solr.dependencies
}
我是这样做的:

project.buildscript.configurations.classpath.each {
    String jarName = it.getName();
    print jarName + ":"
}

我需要lombok.jar作为gwt构建的java构建标志,这非常有效

configurations { 
 lombok
}
dependencies {
  lombok 'org.projectlombok:lombok+'
} 
ext {
   lombok = configurations.lombok.asPath
}

compileGwt {
  jvmArgs "-javaagent:${lombok}=ECJ"
}

我感到惊讶的是,该解决方案在配置阶段足够早地发挥作用,但它确实发挥了作用。

我最近也遇到了这个问题。如果您正在构建一个java应用程序,当前的问题通常是希望将
group:module
groupId:artifactId
)映射到jar的路径(即版本不是搜索标准,因为在一个应用程序中,每个特定jar通常只有一个版本)

在我的gradle 5.1.1(基于kotlin)gradle构建中,我通过以下方法解决了这个问题:

var spec2File: Map<String, File> = emptyMap()
configurations.compileClasspath {
    val s2f: MutableMap<ResolvedModuleVersion, File> = mutableMapOf()
    // https://discuss.gradle.org/t/map-dependency-instances-to-file-s-when-iterating-through-a-configuration/7158
    resolvedConfiguration.resolvedArtifacts.forEach({ ra: ResolvedArtifact ->
        s2f.put(ra.moduleVersion, ra.file)
    })
    spec2File = s2f.mapKeys({"${it.key.id.group}:${it.key.id.name}"})
    spec2File.keys.sorted().forEach({ it -> println(it.toString() + " -> " + spec2File.get(it))})
}
在此之后,您可以使用此
地图
执行一些有用的操作。在我的例子中,我向Java 11构建添加了一些
--path module
选项,如下所示:

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
val patchModule = listOf(
        "--patch-module", "commons.logging=" +
        spec2File["org.slf4j:jcl-over-slf4j"].toString(),

        "--patch-module", "org.apache.commons.logging=" +
        spec2File["org.slf4j:jcl-over-slf4j"].toString()
)
patchModule.forEach({it -> println(it)})

tasks {
        withType<JavaCompile> {
            doFirst {
                options.compilerArgs.addAll(listOf(
                        "--release", "11",
                        "--module-path", classpath.asPath
                ) + patchModule)
                // println("Args for for ${name} are ${options.allCompilerArgs}")
            }
        }
}
val patchModule=listOf(
--修补程序模块,“commons.logging=”+
spec2File[“org.slf4j:jcl-over-slf4j”].toString(),
“--修补程序模块”,“org.apache.commons.logging=”+
spec2File[“org.slf4j:jcl-over-slf4j”].toString()
)
patchModule.forEach({it->println(it)})
任务{
withType{
首先{
options.compilerArgs.addAll(列表)(
“--释放”、“11”,
“--模块路径”,classpath.asPath
)+配线架(模块)
//println(“用于${name}的参数是${options.allCompilerArgs}”)
}
}
}

顺便说一下,“:”在Windows上不起作用。使用
File.pathSeparator
可以解决这个问题。