복붙노트

[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. ==============================

    1.코드를 단순화 할 수 있습니다 (예 : project.configurations.compile.find {it.name.startsWith ( "solr-solrj-")}).

    코드를 단순화 할 수 있습니다 (예 : project.configurations.compile.find {it.name.startsWith ( "solr-solrj-")}).

  2. ==============================

    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. ==============================

    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. ==============================

    4.여기 내가 어떻게 그랬는가 :

    여기 내가 어떻게 그랬는가 :

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

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