Подтвердить что ты не робот

Самый чистый путь в Gradle, чтобы получить путь к файлу jar в кэше зависимостей Gradle

Я использую Gradle, чтобы помочь автоматизировать задачи Hadoop. При вызове Hadoop мне нужно пройти путь к некоторым банкам, от которых зависит мой код, чтобы Hadoop мог отправлять эту зависимость во время фазы карты/уменьшения.

Я разобрался с чем-то, что работает, но он чувствует себя грязным, и мне интересно, есть ли какая-то функция, которую я где-то не хватает.

Это упрощенная версия моего Gradle script, которая имеет зависимость от jar solr 3.5.0 и задачи 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'}
}

running this дает мне вывод следующим образом:

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

Есть ли лучший способ сделать это?

4b9b3361

Ответ 1

Ваш код можно упростить, например project.configurations.compile.find { it.name.startsWith("solr-solrj-") }.

Ответ 2

Вы также можете создать выделенную конфигурацию для артефакта, чтобы он был чистым; и используйте asPath, если тот факт, что он потенциально может вернуть несколько мест, хорошо работает для вашего случая использования (происходит, если он разрешает одну и ту же банку в нескольких местах):

configurations {
  solr
}

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

task findSolrJars() {
  println configurations.solr.asPath
}

Чтобы избежать копирования-вставки, если вам нужна эта банка в конфигурации compile, вы можете добавить эту выделенную конфигурацию в compile one, например:

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

Ответ 3

Вот как я это сделал:

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

Ответ 4

Мне нужен lombok.jar как флаг сборки java для gwt builds, это сработало отлично!

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

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

Я был удивлен, что резолюция работала достаточно рано в фазе конфигурации, но это происходит.

Ответ 5

У меня недавно была и эта проблема. Если вы создаете Java-приложение, проблема обычно заключается в том, что вы хотите получить groupId:artifactId group:module (groupId:artifactId) в путь к jar- groupId:artifactId (т. groupId:artifactId Версия не является критерием поиска, поскольку в одном приложении она обычно есть). только одна версия каждой конкретной банки).

В моей сборке Gradle 5.1.1 (на основе kotlin) я решил эту проблему с помощью:

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))})
}

Вывод будет примерно таким:

:jing -> /home/tpasch/scm/db-toolchain/submodules/jing-trang/build/jing.jar
:prince -> /home/tpasch/scm/db-toolchain/lib/prince-java/lib/prince.jar
com.github.jnr:jffi -> /home/tpasch/.gradle/caches/modules-2/files-2.1/com.github.jnr/jffi/1.2.18/fb54851e631ff91651762587bc3c61a407d328df/jffi-1.2.18-native.jar
com.github.jnr:jnr-constants -> /home/tpasch/.gradle/caches/modules-2/files-2.1/com.github.jnr/jnr-constants/0.9.12/cb3bcb39040951bc78a540a019573eaedfc8fb81/jnr-constants-0.9.12.jar
com.github.jnr:jnr-enxio -> /home/tpasch/.gradle/caches/modules-2/files-2.1/com.github.jnr/jnr-enxio/0.19/c7664aa74f424748b513619d71141a249fb74e3e/jnr-enxio-0.19.jar

После этого вам остается сделать что-то полезное с этой Map. В моем случае я добавляю некоторые --path-module в мою сборку Java 11 следующим образом:

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}")
            }
        }
}