このページでは、Maven から Bazel に移行する方法について説明します。具体的には、 前提条件とインストール手順をご覧ください。Maven および Guava プロジェクトを使用した移行例を示しています。
どのビルドツールから Bazel に移行する場合でも、両方のビルドツールを用意することをおすすめします。 開発チームの CI/CD ジョブを 完全に移行するまで並列実行が可能です その他すべての関連システムが含まれます。Maven と Bazel は、同じコンテナで できます。
始める前に
- Bazel をインストールします(まだインストールしていない場合)。
- Bazel を初めて使用する場合は、Bazel の概要: 移行を開始する前に Java をビルドします。このチュートリアルでは、 Bazel のコンセプト、構造、ラベル構文。
Maven と Bazel の違い
- Maven では最上位の
pom.xml
ファイルを使用します。Bazel は複数のビルドファイルをサポートしていますBUILD
ファイルごとに複数のターゲットを設定できるため、より高度なビルドが可能になります。 増分的なものです - Maven がデプロイ プロセスの手順を管理します。Bazel は デプロイを自動化します。
- Bazel を使用すると、言語間の依存関係を表現できます。
- 新しいセクションをプロジェクトに追加すると、Bazel で新規セクションの追加が必要になることがあります。
BUILD
ファイル。ベスト プラクティスは、新しい Java ごとにBUILD
ファイルを追加することです。 パッケージ化されています。
Maven から Bazel に移行する
プロジェクトを Bazel に移行する手順は次のとおりです。
以下の例は、Guava
プロジェクトを Maven から Bazel に移行します。「
使用される Guava プロジェクトはリリース v31.1
です。Guava を使用している例は、
移行の各ステップが表示されますが、実際に移行された
移行のために手動で生成または追加されます。
$ git clone https://github.com/google/guava.git && cd guava
$ git checkout v31.1
1. MODULE.bazel ファイルを作成する
プロジェクトのルートに MODULE.bazel
という名前のファイルを作成します。プロジェクトで
外部依存関係がない場合、このファイルは空にできます。
プロジェクトがどれにも含まれていないファイルやパッケージに依存している場合、
それらの外部依存関係を MODULE.bazel
表示されます。rules_jvm_external
を使用すると、Maven からの依存関係を管理できます。対象
このルールセットの使用手順については、
README
をタップします。
Guava プロジェクトの例: 外部依存関係
Guava の外部依存関係を
プロジェクトを
rules_jvm_external
使用します。
次のスニペットを MODULE.bazel
ファイルに追加します。
bazel_dep(name = "rules_jvm_external", version = "6.2")
maven = use_extension("@rules_jvm_external//:extensions.bzl", "maven")
maven.install(
artifacts = [
"com.google.code.findbugs:jsr305:3.0.2",
"com.google.errorprone:error_prone_annotations:2.11.0",
"com.google.j2objc:j2objc-annotations:1.3",
"org.codehaus.mojo:animal-sniffer-annotations:1.20",
"org.checkerframework:checker-qual:3.12.0",
],
repositories = [
"https://repo1.maven.org/maven2",
],
)
use_repo(maven, "maven")
2. 1 つの BUILD ファイルを作成する
ワークスペースが定義され、外部依存関係(
リストがある場合は、BUILD
ファイルを作成して、
プロジェクトがビルドされるはずです。単一の pom.xml
ファイルを持つ Maven とは異なり、Bazel では
多数の BUILD
ファイルが必要です。これらのファイルには、
Bazel による増分ビルドの生成を可能にします。
BUILD
ファイルを段階的に追加します。まず、プロジェクトのルートに BUILD
ファイルを 1 つ追加します。
Bazel による初期ビルドに使用できます。次に
よりきめ細かなターゲットで BUILD
ファイルを追加することで、ビルドを調整できます。
MODULE.bazel
ファイルと同じディレクトリにテキスト ファイルを作成し、BUILD
という名前を付けます。この
BUILD
ファイルで、適切なルールを使用してビルドするターゲットを 1 つ作成します。 作成します。次のヒントを参考にしてください。適切なルールを使用します。
単一の Maven モジュールでプロジェクトをビルドするには、 次のような
java_library
ルールがあります。java_library( name = "everything", srcs = glob(["src/main/java/**/*.java"]), resources = glob(["src/main/resources/**"]), deps = ["//:all-external-targets"], )
複数の Maven モジュールを含むプロジェクトをビルドするには、 次のような
java_library
ルールがあります。java_library( name = "everything", srcs = glob([ "Module1/src/main/java/**/*.java", "Module2/src/main/java/**/*.java", ... ]), resources = glob([ "Module1/src/main/resources/**", "Module2/src/main/resources/**", ... ]), deps = ["//:all-external-targets"], )
バイナリをビルドするには、
java_binary
ルールを使用します。java_binary( name = "everything", srcs = glob(["src/main/java/**/*.java"]), resources = glob(["src/main/resources/**"]), deps = ["//:all-external-targets"], main_class = "com.example.Main" )
属性を指定します。
name
: ターゲットにわかりやすい名前を付けます。例では、 上の場合、ターゲットは「Everything」と呼ばれます。srcs
: グロビングを使用して、プロジェクト内のすべての .java ファイルを一覧表示します。resources
: グロビングを使用してプロジェクト内のすべてのリソースを一覧表示します。deps
: どの外部依存関係が 決定できます。
この最上位のビルドの例を以下に示します。 ファイルを Guava プロジェクトの移行からインストールします。
プロジェクトのルートに
BUILD
ファイルが作成されたので、次は 動作していることを確認します。コマンドライン、ワークスペースからbazel build //:everything
を使用して、Bazel でプロジェクトをビルドします。これで、Bazel を使用したプロジェクトが正常にビルドされました。新しい P-MAX キャンペーンを プロジェクトの増分ビルドを可能にする
BUILD
ファイルの追加。
Guava プロジェクトの例: 1 つの BUILD ファイルから開始する
Guava プロジェクトを Bazel に移行する場合、最初に 1 つの BUILD
ファイルが使用されます。
プロジェクト全体を構築します。この最初の BUILD
ファイルの内容は、
次の作業を行います。
java_library(
name = "everything",
srcs = glob([
"guava/src/**/*.java",
"futures/failureaccess/src/**/*.java",
]),
javacopts = ["-XepDisableAllChecks"],
deps = [
"@maven//:com_google_code_findbugs_jsr305",
"@maven//:com_google_errorprone_error_prone_annotations",
"@maven//:com_google_j2objc_j2objc_annotations",
"@maven//:org_checkerframework_checker_qual",
"@maven//:org_codehaus_mojo_animal_sniffer_annotations",
],
)
3. さらに BUILD ファイルを作成する(省略可)
次のタスクを完了した後に確認したように、Bazel は 1 つの BUILD file
で動作します。
作成します。ビルドを小さなチャンクに分割することも検討してください。
ターゲットを細かく指定して BUILD
ファイルを追加する。
複数のターゲットを持つ複数の BUILD
ファイルを使用すると、ビルドが増加します。
以下が可能になります。
- プロジェクトの増分ビルドの増加
- ビルドの並列実行が増えたため
- 将来のユーザーのためにビルドの保守性を向上させる
- パッケージ間のターゲットの可視性を制御するため、 たとえば、実装の詳細を含むライブラリが 公開 API を提供します。
BUILD
ファイルをさらに追加する際のヒント:
- まず、各 Java パッケージに
BUILD
ファイルを追加します。Java で始める 依存関係が最も少ないパッケージを順にチェックし、 依存関係が特に多い状態になっています。 BUILD
ファイルを追加してターゲットを指定したら、これらの新しいターゲットを それらに依存するターゲットのdeps
セクション。なお、glob()
関数はパッケージの境界を越えないため、パッケージの数は サイズが大きくなり、glob()
に一致するファイルが縮小されます。BUILD
ファイルをmain
ディレクトリに追加する場合は、必ずBUILD
ファイルを対応するtest
ディレクトリに移動します。- パッケージ間の可視性を適切に制限するように注意してください。
BUILD
ファイルの設定で発生したエラーをトラブルシューティングしやすくするために、 Bazel でビルドが継続されていることを確認できます。bazel build //...
を実行して、すべてのターゲットが引き続きビルドされていることを確認します。
4. Bazel を使用したビルド
BUILD
ファイルを追加して設定を検証し、Bazel を使用してビルドしている
表示されます。
目的の粒度の BUILD
ファイルがある場合は、Bazel を使用して次のことを行えます。
すべてのビルドを生成できます