[HADOOP] 그라디언트 종속성 캐시의 jar 파일 경로를 얻는 가장 간단한 방법
HADOOP그라디언트 종속성 캐시의 jar 파일 경로를 얻는 가장 간단한 방법
Hadoop 작업을 자동화하는 데 Gradle을 사용하고 있습니다. Hadoop을 호출 할 때, Hadoop이 map / reduce 단계에서 종속성을 보낼 수 있도록 코드에 의존하는 jar 파일의 경로를 전달할 수 있어야합니다.
나는 작동하는 것을 알아 냈지만 지저분한 느낌이 들며 어딘가에없는 기능이 있는지 궁금합니다.
이 파일은 solr 3.5.0 jar에 의존성이있는 내 gradc 스크립트의 간소화 된 버전이며, 오른쪽에있는 모든 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
이 작업을 수행하는 더 좋은 방법이 있습니까?
해결법
-
==============================
1.코드를 단순화 할 수 있습니다 (예 : project.configurations.compile.find {it.name.startsWith ( "solr-solrj-")}).
코드를 단순화 할 수 있습니다 (예 : project.configurations.compile.find {it.name.startsWith ( "solr-solrj-")}).
-
==============================
2.아티팩트에 대한 전용 구성을 작성하여이를 유지할 수도 있습니다. 잠재적으로 여러 위치를 반환 할 수 있다는 사실이 유스 케이스에서 잘 작동하면 asPath를 사용하십시오 (여러 위치에서 동일한 병을 해결할 경우 발생합니다).
아티팩트에 대한 전용 구성을 작성하여이를 유지할 수도 있습니다. 잠재적으로 여러 위치를 반환 할 수 있다는 사실이 유스 케이스에서 잘 작동하면 asPath를 사용하십시오 (여러 위치에서 동일한 병을 해결할 경우 발생합니다).
configurations { solr } dependencies { solr 'org.apache.solr:solr-solrj:3.5.0' } task findSolrJars() { println configurations.solr.asPath }
복사 - 붙여 넣기를 피하려면 컴파일 구성에서 jar 파일이 필요할 경우를 대비하여 다음과 같이이 전용 구성을 컴파일에 추가 할 수 있습니다.
dependencies { solr 'org.apache.solr:solr-solrj:3.5.0' compile configurations.solr.dependencies }
-
==============================
3.나는 lombok.jar을 Java 빌드 플래그로 필요로했다.
나는 lombok.jar을 Java 빌드 플래그로 필요로했다.
configurations { lombok } dependencies { lombok 'org.projectlombok:lombok+' } ext { lombok = configurations.lombok.asPath } compileGwt { jvmArgs "-javaagent:${lombok}=ECJ" }
나는 결의안이 컨피규레이션 단계에서 일찌기 효과가 있었지만 놀랐다.
-
==============================
4.여기 내가 어떻게 그랬는가 :
여기 내가 어떻게 그랬는가 :
project.buildscript.configurations.classpath.each { String jarName = it.getName(); print jarName + ":" }
-
==============================
5.나는 최근에도이 문제를 안고있었습니다. Java 애플리케이션을 빌드하는 경우 일반적으로 그룹 (moduleId : artifactId)을 경로 대 Jar 매핑에 가져 오려는 문제점이 있습니다 (예 : 버전이 한 앱의 검색 기준이 아니므로 정상적으로 존재합니다 각 특정 항아리 한 버전 만).
나는 최근에도이 문제를 안고있었습니다. Java 애플리케이션을 빌드하는 경우 일반적으로 그룹 (moduleId : artifactId)을 경로 대 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))}) }
출력은 다음과 같습니다.
: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
그 후,이 맵과 관련하여 유용한 것을하는 것은 당신에게 달려 있습니다. 제 경우에는 다음과 같이 Java 11 빌드에 --path-module 옵션을 추가합니다.
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}") } } }
from https://stackoverflow.com/questions/9577929/cleanest-way-in-gradle-to-get-the-path-to-a-jar-file-in-the-gradle-dependency-ca by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] hdfs에`pwd`와 동일한 기능이 있습니까? (0) | 2019.07.15 |
---|---|
[HADOOP] thread "main"예외 java.lang.UnsupportedClassVersionError, 지원되지 않는 major.minor 버전 52.0 (0) | 2019.07.15 |
[HADOOP] nifi ConvertRecord JSON에서 CSV로 단일 레코드 만 얻으시겠습니까? (0) | 2019.07.15 |
[HADOOP] hadoop의 작업 클라이언트가 inputSplits를 계산하는 방법 (0) | 2019.07.15 |
[HADOOP] EMR- 자동 조절이 필요합니까? EC2 만 사용해야합니까? Qubole을 사용해야할까요? (0) | 2019.07.15 |