>Java >사용자 정의 소스 세트를 사용한 Gradle 다중 모듈 빌드: 종속 모듈의 컴파일 클래스 경로에서 클래스가 누락되었습니다.

사용자 정의 소스 세트를 사용한 Gradle 다중 모듈 빌드: 종속 모듈의 컴파일 클래스 경로에서 클래스가 누락되었습니다.

WBOY
WBOY앞으로
2024-02-11 23:27:081181검색

php 편집기 Xinyi는 이 기사에서 사용자 정의 소스 세트와 함께 Gradle 다중 모듈 구성을 사용하는 방법을 소개합니다. 빌드 프로세스 중에 종속 모듈의 컴파일된 클래스 경로에 클래스가 누락되는 문제가 자주 발생합니다. 이 기사에서는 이 문제의 원인을 자세히 설명하고 모든 필수 클래스가 종속 모듈의 컴파일된 클래스 경로에 포함되도록 하는 솔루션을 제공합니다. 이 글의 안내를 통해 Gradle 다중 모듈 구성에서 사용자 정의 소스 세트 기능을 더 잘 이해하고 적용할 수 있으며, 프로젝트의 구성 효율성과 유지 관리성을 향상시킬 수 있습니다.

질문 내용

저는 현재 완전히 Java로 작성되고 Gradle(8.4)로 구축된 프로젝트인 openlineage Spark 통합에 기여하고 있습니다. 이것은 다중 모듈 프로젝트이며 해당 모듈의 이름은 appsharedspark2spark3spark32spark33spark34spark35입니다.

질문: 런타임 오류를 방지하기 위해 Apache Spark의 scala 2.12 및 2.13 변형용 shared 模块。所有模块(spark2spark35)都依赖于 shared。我的目标是编译像 spark35 这样的模块来生成两个版本:一个用于 scala 2.12,另一个用于 apache spark 的 scala 2.13 变体。这还需要使用相应的 spark 变体正确构建 shared 모듈을 빌드하려고 합니다.

촬영 방법: spark33spark34spark35shared中引入了源集scala213testscala213。这些源集使用与 maintest 源相同的源。 apache spark 的 scala 2.12 变体的依赖项设置为默认值,并且我对 scala 2.13 源集有附加声明。这包括对 shared 모듈의 종속성에서 Java 라이브러리 플러그인을 사용합니다.

발생한 문제: shared 项目请求 scala213runtimeelements (甚至是 scala213apielements 配置)时,编译类路径不包含 shared 모듈에서 컴파일된 클래스를 가져올 때. 그러나 기본 구성으로 되돌린 후에는 이러한 클래스가 클래스 경로에 표시됩니다.

질문: 특정 구성(scala213runtimeelements) 会导致 shared 模块的编译类从我的其他模块的编译类路径中丢失?如何解决此问题以确保 shared 스칼라 2.12 및 2.13 버전의 클래스 경로에 클래스가 포함된 모듈)을 지정하는 이유는 무엇입니까?

아래에서 다양한 build.gradle 파일을 찾을 수 있습니다.

share/build.gradle

으아아아

spark33/build.gradle:

sourcesets {
    scala213 {
        java.srcdir("src/main/java")
        resources.srcdir("src/main/resources")
    }

    testscala213 {
        compileclasspath += sourcesets.scala213.output
        runtimeclasspath += sourcesets.scala213.output

        java.srcdir("src/test/java")
        resources.srcdir("src/test/resources")
    }
}

configurations {
    scala213api
    
    scala213apielements {
        extendsfrom(scala213api)
        canberesolved = false
        canbeconsumed = true
    }
    
    scala213implementation.extendsfrom(scala213api)
    
    scala213runtimeelements {
        extendsfrom(scala213implementation, scala213runtimeonly)
        canberesolved = false
        canbeconsumed = true
    }
    
    scala213compileclasspath {
        extendsfrom(scala213compileonly, scala213implementation)
        canberesolved = true
    }

    scala213runtimeclasspath {
        extendsfrom(scala213implementation, scala213runtimeonly)
        canberesolved = true
    }
    
    testscala213implementation.extendsfrom(scala213implementation)
    testscala213runtimeonly.extendsfrom(scala213runtimeonly)

    testscala213compileclasspath {
        extendsfrom(testscala213compileonly, testscala213implementation)
        canberesolved = true
    }

    testscala213runtimeclasspath {
        extendsfrom(testscala213implementation, testscala213runtimeonly)
        canberesolved = true
    }
}

Solution

알겠습니다. 나는 그것에 대해 생각했다. RTFM의 경우입니다.

구체적으로는 설명서의 이 부분입니다. shared 프로젝트에 "변형" 아티팩트를 추가하지 않았습니다. 따라서 Gradle은 무엇을 소비해야 할지 전혀 모릅니다. 혼란스럽게도 기본 구성은 클래스를 사용하는 반면 변형에는 JAR이 필요합니다.

위 내용은 사용자 정의 소스 세트를 사용한 Gradle 다중 모듈 빌드: 종속 모듈의 컴파일 클래스 경로에서 클래스가 누락되었습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제