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
これを行うより良い方法はありますか?
コードは、たとえばproject.configurations.compile.find { it.name.startsWith("solr-solrj-") }
のように少し簡略化できます。
アーティファクト専用の構成を作成して、クリーンに保つこともできます。複数の場所を返す可能性があるという事実がユースケースでうまく機能する場合は、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
}
Javaビルドフラグにgomboビルドフラグとしてlombok.jarが必要でしたが、これはうまくいきました!
configurations {
lombok
}
dependencies {
lombok 'org.projectlombok:lombok+'
}
ext {
lombok = configurations.lombok.asPath
}
compileGwt {
jvmArgs "-javaagent:${lombok}=ECJ"
}
設定フェーズの早い段階で解決策が機能したことに驚きましたが、実際に機能しました。
ここに私がそれをした方法があります:
project.buildscript.configurations.classpath.each {
String jarName = it.getName();
print jarName + ":"
}
私も最近この問題を抱えていました。 Javaアプリを構築している場合、当面の問題は通常、group:module
(groupId: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}")
}
}
}