カスタム ソース セットを使用した Gradle マルチモジュール ビルド: 依存モジュールのコンパイル クラスパスにクラスがありません
Feb 11, 2024 pm 11:27 PMphp 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の場合です。 具体的には、
マニュアルのこの部分。 「バリアント」アーティファクトをshared
プロジェクトに追加しませんでした。したがって、Gradle は何を消費すべきかわかりません。紛らわしいことに、デフォルト構成ではクラスが使用されますが、バリアントでは JAR が必要です。以上がカスタム ソース セットを使用した Gradle マルチモジュール ビルド: 依存モジュールのコンパイル クラスパスにクラスがありませんの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

人気の記事

人気の記事

ホットな記事タグ

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









