web-dev-qa-db-ja.com

Gradleで最もクリーンな方法で、Gradleの依存関係キャッシュにあるjarファイルへのパスを取得する

Gradleを使用してHadoopタスクを自動化しています。 Hadoopを呼び出すときに、コードが依存するいくつかのjarへのパスを渡すことができるようにする必要があります。これにより、Hadoopは、マップ/リデュースフェーズ中に依存関係を送信できます。

私はうまくいくことを見つけましたが、それは厄介な感じで、どこかに足りない機能があるかどうか疑問に思っています。

これは、solr 3.5.0 jarに依存する私のgradleスクリプトの簡略化されたバージョンであり、構成内のすべてのjarファイルを反復して正しいものを見つけるfindSolrJarタスクです。

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

これを行うより良い方法はありますか?

37
Ted Naleid

コードは、たとえばproject.configurations.compile.find { it.name.startsWith("solr-solrj-") }のように少し簡略化できます。

29

アーティファクト専用の構成を作成して、クリーンに保つこともできます。複数の場所を返す可能性があるという事実がユースケースでうまく機能する場合は、asPathを使用します(複数の場所で同じjarを解決する場合に起こります)。

configurations {
  solr
}

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

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

コピー貼り付けを避けるために、compile構成でjarも必要な場合は、この専用構成をcompile構成に追加できます。

dependencies {
  solr 'org.Apache.solr:solr-solrj:3.5.0'
  compile configurations.solr.dependencies
}
28
Timur

Javaビルドフラグにgomboビルドフラグとしてlombok.jarが必要でしたが、これはうまくいきました!

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

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

設定フェーズの早い段階で解決策が機能したことに驚きましたが、実際に機能しました。

3
DALDEI

ここに私がそれをした方法があります:

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

私も最近この問題を抱えていました。 Javaアプリを構築している場合、当面の問題は通常、group:modulegroupId:artifactId)からjarへのマッピング(つまり、バージョンは検索基準ではないため、1つのアプリでは通常、特定のjarのバージョンは1つだけです)。

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

出力は次のようになります。

: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 my 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}")
            }
        }
}
0
aanno