Maven から Bazel への移行

<ph type="x-smartling-placeholder"></ph> 問題を報告する <ph type="x-smartling-placeholder"></ph> ソースを表示 夜間 · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

このページでは、Maven から Bazel に移行する方法について説明します。具体的には、 前提条件とインストール手順をご覧ください。Maven および Guava プロジェクトを使用した移行例を示しています。

どのビルドツールから Bazel に移行する場合でも、両方のビルドツールを用意することをおすすめします。 開発チームの CI/CD ジョブを 完全に移行するまで並列実行が可能です その他すべての関連システムが含まれます。Maven と Bazel は、同じコンテナで できます。

始める前に

Maven と Bazel の違い

  • Maven では最上位の pom.xml ファイルを使用します。Bazel は複数のビルドファイルをサポートしています BUILD ファイルごとに複数のターゲットを設定できるため、より高度なビルドが可能になります。 増分的なものです
  • Maven がデプロイ プロセスの手順を管理します。Bazel は デプロイを自動化します。
  • Bazel を使用すると、言語間の依存関係を表現できます。
  • 新しいセクションをプロジェクトに追加すると、Bazel で新規セクションの追加が必要になることがあります。 BUILD ファイル。ベスト プラクティスは、新しい Java ごとに BUILD ファイルを追加することです。 パッケージ化されています。

Maven から Bazel に移行する

プロジェクトを Bazel に移行する手順は次のとおりです。

  1. MODULE.bazel ファイルを作成する
  2. 1 つの Build ファイルを作成する
  3. さらに BUILD ファイルを作成する
  4. 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 ファイルを追加することで、ビルドを調整できます。

  1. MODULE.bazel ファイルと同じディレクトリにテキスト ファイルを作成し、 BUILD という名前を付けます。

  2. この 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 プロジェクトの移行からインストールします。

  3. プロジェクトのルートに 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 を使用して次のことを行えます。 すべてのビルドを生成できます