このページでは、Maven から Bazel に移行する方法について説明します。具体的には、 前提条件とインストール手順をご覧ください。この 2 つのモデルの違いと また、Maven と Bazel を使用した移行例も紹介します。 Guava プロジェクト。
どのビルドツールから Bazel に移行する場合でも、両方のビルドを使用することをおすすめします。 開発チームが完全に移行されるまで 複数のツールを並行して実行できます CI システム、その他の関連システムです。Maven と Bazel は 同じリポジトリにあります
始める前に
- Bazel をインストールします(まだインストールしていない場合)。
- Bazel を初めて使用する場合は、チュートリアルをご覧ください 始める前に、Bazel の概要: Java のビルドを行ってください。 移行します。Bazel のコンセプト、構造、ラベルについて説明します 説明します。
Maven と Bazel の違い
- Maven では最上位の
pom.xml
ファイルを使用します。Bazel は複数のビルドをサポート 複数のファイルとBUILD
ファイルごとの複数のターゲットにより、 Maven よりもインクリメンタリティがあります。 - Maven がデプロイ プロセスの手順を管理します。Bazel は以下を行います デプロイを自動化できません
- Bazel を使用すると、言語間の依存関係を表現できます。
- 新しいセクションをプロジェクトに追加すると、Bazel で新規セクションの追加が必要になることがあります。
BUILD
ファイル。新しい Java パッケージごとにBUILD
ファイルを追加することをおすすめします。
Maven から Bazel に移行する
プロジェクトを Bazel に移行する手順は次のとおりです。
以下の例は、
Maven から Bazel への Guava プロジェクト。
使用される Guava プロジェクトはリリース v31.1
です。Guava を使用する例では説明が省略されます。
移行の各ステップが表示されますが、移行されたファイルと
手動で生成または追加することもできます。
$ git clone https://github.com/google/guava.git && cd guava
$ git checkout v31.1
1. WORKSPACE ファイルを作成する
プロジェクトのルートに WORKSPACE
という名前のファイルを作成します。プロジェクトで
外部依存関係がない場合、ワークスペース ファイルは空にできます。
プロジェクトがどれにも含まれていないファイルやパッケージに依存している場合、
作業するときに、ワークスペースで外部依存関係を指定します。
表示されます。ワークスペース ファイルの外部依存関係のリストを自動化するには、
rules_jvm_external
を使用します。このルールセットの使用方法については、以下をご覧ください。
README。
Guava プロジェクトの例: 外部依存関係
アプリケーションの外部依存関係を
Guava プロジェクト
rules_jvm_external
使用します。
次のスニペットを WORKSPACE
ファイルに追加します。
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
RULES_JVM_EXTERNAL_TAG = "4.3"
RULES_JVM_EXTERNAL_SHA = "6274687f6fc5783b589f56a2f1ed60de3ce1f99bc4e8f9edef3de43bdf7c6e74"
http_archive(
name = "rules_jvm_external",
sha256 = RULES_JVM_EXTERNAL_SHA,
strip_prefix = "rules_jvm_external-%s" % RULES_JVM_EXTERNAL_TAG,
url = "https://github.com/bazelbuild/rules_jvm_external/archive/%s.zip" % RULES_JVM_EXTERNAL_TAG,
)
load("@rules_jvm_external//:defs.bzl", "maven_install")
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",
],
)
2. 1 つの BUILD ファイルを作成する
ワークスペースが定義され、外部依存関係(
リストにある場合は、プロジェクトの使用方法を記述した BUILD
ファイルを作成する必要があります。
構築する必要があります。1 つの pom.xml
ファイルを使用する Maven とは異なり、Bazel では多数のファイルを使用できます。
プロジェクトをビルドする BUILD
ファイル。これらのファイルには、複数のビルド ターゲット、
Bazel による増分ビルドを生成できます。
BUILD
ファイルを段階的に追加します。まず BUILD
ファイルを 1 つ追加します
をプロジェクトのルートに置いて、Bazel による初期ビルドに使用できます。
次に、より詳細な BUILD
ファイルを追加してビルドを改良します。
できます。
WORKSPACE
ファイルと同じディレクトリにテキスト ファイルを作成し、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
: どの外部依存関係が 決定できます。たとえば、外部 IP アドレスのリストを生成すると、generate_workspace
ツールを使用する場合、依存関係はjava_library
のライブラリは、generated_java_libraries
マクロ。
詳しくは、 この最上位の BUILD ファイルの例を以下に示します。 Guava プロジェクトの移行です
プロジェクトのルートに
BUILD
ファイルがあるので、ビルドします。 動作していることを確認します。コマンドラインで 作成するには、bazel build //:everything
を使用して Bazel を使ってプロジェクトを作成します。これで、Bazel を使用したプロジェクトが正常にビルドされました。次が必要です プロジェクトの増分ビルドを可能にするために、
BUILD
ファイルを追加します。
Guava プロジェクトの例: 1 つの BUILD ファイルから開始する
Guava プロジェクトを Bazel に移行する場合、最初に 1 つの BUILD
ファイルが使用されます。
プロジェクト全体を構築できます。この最初の BUILD
の内容は、次のとおりです。
次の作業を行います。
java_library(
name = "everything",
srcs = glob([
"guava/src/**/*.java",
"futures/failureaccess/src/**/*.java",
]),
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 を使用できます
すべてのビルドを生成できます