php editor Xinyi は、この記事でカスタム ソース セットを使用した Gradle マルチモジュール構築の使用方法を紹介します。ビルド プロセス中に、依存モジュールのコンパイルされたクラスパスでクラスが欠落しているという問題がよく発生します。この記事では、この問題の原因を詳細に説明し、必要なすべてのクラスが依存モジュールのコンパイル済みクラスパスに確実に含まれるようにするための解決策を提供します。この記事のガイダンスを通じて、Gradle マルチモジュール構築におけるカスタム ソース セット機能をよりよく理解して適用し、プロジェクトの構築効率と保守性を向上させることができます。
私は現在、完全に Java で構築され、gradle (8.4) で構築されたプロジェクトである openlineage Spark 統合に貢献しています。これは、モジュール名 app
、shared
、spark2
、spark3
、spark32
を持つマルチモジュール プロジェクトです。 spark33
、spark34
、spark35
。
shared モジュールをビルドしようとしています。すべてのモジュール (spark2 から
spark35) は
shared に依存します。私の目標は、
spark35 のようなモジュールをコンパイルして 2 つのバージョンを生成することです。1 つは scala 2.12 用で、もう 1 つは Apache Spark の scala 2.13 バリアント用です。これには、実行時エラーを回避するために、対応する Spark バリアントを使用して
shared モジュールを正しくビルドする必要もあります。
採用された方法:
scala213 と spark33、
spark34、
spark35、
shared を導入しました。 #testscala213
。これらのソース セットは、main
および test
ソースと同じソースを使用します。 Apache Spark の scala 2.12 バリアントの依存関係はデフォルトに設定されており、scala 2.13 ソース セット用に追加の宣言があります。これには、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の場合です。 具体的には、
マニュアルのこの部分。 「バリアント」アーティファクトを以上がカスタム ソース セットを使用した Gradle マルチモジュール ビルド: 依存モジュールのコンパイル クラスパスにクラスがありませんの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。