ホームページ >Java >カスタム ソース セットを使用した Gradle マルチモジュール ビルド: 依存モジュールのコンパイル クラスパスにクラスがありません

カスタム ソース セットを使用した Gradle マルチモジュール ビルド: 依存モジュールのコンパイル クラスパスにクラスがありません

WBOY
WBOY転載
2024-02-11 23:27:081181ブラウズ

php editor Xinyi は、この記事でカスタム ソース セットを使用した Gradle マルチモジュール構築の使用方法を紹介します。ビルド プロセス中に、依存モジュールのコンパイルされたクラスパスでクラスが欠落しているという問題がよく発生します。この記事では、この問題の原因を詳細に説明し、必要なすべてのクラスが依存モジュールのコンパイル済みクラスパスに確実に含まれるようにするための解決策を提供します。この記事のガイダンスを通じて、Gradle マルチモジュール構築におけるカスタム ソース セット機能をよりよく理解して適用し、プロジェクトの構築効率と保守性を向上させることができます。

質問の内容

私は現在、完全に Java で構築され、gradle (8.4) で構築されたプロジェクトである openlineage Spark 統合に貢献しています。これは、モジュール名 appsharedspark2spark3spark32 を持つマルチモジュール プロジェクトです。 spark33spark34spark35

######質問:### Apache Spark の scala 2.12 および 2.13 バリアント用の

shared モジュールをビルドしようとしています。すべてのモジュール (spark2 から spark35) は shared に依存します。私の目標は、spark35 のようなモジュールをコンパイルして 2 つのバージョンを生成することです。1 つは scala 2.12 用で、もう 1 つは Apache Spark の scala 2.13 バリアント用です。これには、実行時エラーを回避するために、対応する Spark バリアントを使用して shared モジュールを正しくビルドする必要もあります。 採用された方法:

Java ライブラリ プラグイン ## を使用して、ソース セット

scala213spark33spark34spark35shared を導入しました。 #testscala213。これらのソース セットは、main および test ソースと同じソースを使用します。 Apache Spark の scala 2.12 バリアントの依存関係はデフォルトに設定されており、scala 2.13 ソース セット用に追加の宣言があります。これには、shared モジュールへの依存関係が含まれます。 発生した問題:

shared

プロジェクトから scala213runtimeelements (scala213apielements 構成も) をリクエストすると、コンパイルされたクラスパスにコンパイルされた shared モジュールの種類が含まれません。 。ただし、デフォルト構成に戻した後は、これらのクラスがクラスパスに存在します。 ######質問:### 特定の構成 (scala213runtimeelements) を指定すると、shared

モジュールのコンパイル済みクラスが他のモジュールのコンパイル済みクラスパスから欠落するのはなぜですか?

shared モジュールのクラスが scala 2.12 および 2.13 バージョンのクラスパスに確実に含まれるようにするには、この問題を解決するにはどうすればよいですか? 以下に、さまざまな build.gradle ファイルがあります。 共有/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
    }
}
解決策

わかりました。私はそれについて考えました。これはRTFMの場合です。 具体的には、

マニュアルのこの部分。 「バリアント」アーティファクトを

shared

プロジェクトに追加しませんでした。したがって、Gradle は何を消費すべきかわかりません。紛らわしいことに、デフォルト構成ではクラスが使用されますが、バリアントでは JAR が必要です。

以上がカスタム ソース セットを使用した Gradle マルチモジュール ビルド: 依存モジュールのコンパイル クラスパスにクラスがありませんの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。