Bazelを使用したJavaアプリケーションの構築

1. 概要

https://bazel.build/[Bazel]は、MavenおよびGradleに似た、ソースコードをビルドおよびテストするためのオープンソースツールです。 *複数の言語のプロジェクトをサポートし、複数のプラットフォーム用の出力を構築します*。
このチュートリアルでは、Bazelを使用して簡単なJavaアプリケーションを構築するために必要な手順を説明します。 例として、マルチモジュールのMavenプロジェクトから始めて、Bazelを使用してソースコードをビルドします。
まず、https://docs.bazel.build/versions/master/install.html [Bazelのインストール]から始めます。

2. プロジェクト構造

マルチモジュールMavenプロジェクトを作成しましょう:
bazel (root)
    pom.xml
    WORKSPACE (bazel workspace)
    |— bazelapp
        pom.xml
        BUILD (bazel build file)
        |— src
            |— main
                |— java
            |— test
                |— java
    |— bazelgreeting
        pom.xml
        BUILD (bazel build file)
        |— src
            |— main
                |— java
            |— test
                |— java
  • _WORKSPACE_ファイルが存在すると、Bazel *のワークスペースが設定されます。 プロジェクトには、1つまたは複数が存在する可能性があります。 この例では、最上位のプロジェクトディレクトリにファイルを1つだけ保持します。

    次に重要なファイルは、ビルドルールを含む* _BUILD_ファイルです*。 一意の_target_ _name_で各ルールを識別します。
    _Bazel_は、* BUILD_ファイルを必要な数だけ持つ*柔軟性を提供し、あらゆるレベルの粒度に設定されます。 これは、_BUILD_ルールを適切に設定することにより、より少ない数のJavaクラスを構築できることを意味します。 物事を単純にするために、この例では最小限の_BUILD_ファイルを保持します。
    Bazel _BUILD_構成の出力は通常jarファイルであるため、_BUILD_ファイルを含む各ディレクトリをビルドパッケージとして参照します。

3. ビルドファイル

* 3.1。 ルール設定*

最初のビルドルールを設定して、Javaバイナリをビルドします。 _bazelapp_モジュールに属する_BUILD_ファイルで設定してみましょう:
java_binary (
    name = "BazelApp",
    srcs = glob(["src/main/java/com/baeldung/*.java"]),
    main_class = "com.baeldung.BazelApp"
)
構成設定を1つずつ理解しましょう。
  • java_binary –ルールの名前。追加が必要です
    バイナリを構築するための属性

  • name –ビルドターゲットの名前

  • srcs –どのJavaかを伝えるファイルの場所パターンの配列
    ビルドするファイル

  • main_class –アプリケーションのメインクラスの名前(オプション)

* 3.2。 ビルド実行*

これでアプリを作成できました。 _WORKSPACE_ file __、__を含むディレクトリから、シェルで_bazel build_コマンドを実行してターゲットをビルドしましょう。
$ bazel build //bazelapp:BazelApp
最後の引数は、_BUILD_ファイルの1つで設定されたターゲット名です。 パターンは「_ // <build_to_build>:<target_name> _」です。
パターンの最初の部分「//」は、ワークスペースディレクトリから開始することを示します。 次の_“ bazelapp” _は、ワークスペースディレクトリからの_BUILD_ファイルへの相対パスです。 最後に、_“ BazelApp” _はビルドするターゲット名です。

* 3.3。 ビルド出力*

これで、前の手順の2つのバイナリ出力ファイルに気付くはずです。
bazel-bin/bazelapp/BazelApp.jar
bazel-bin/bazelapp/BazelApp
_BazelApp.jar_にはすべてのクラスが含まれていますが、_BazelApp_はjarファイルを実行するラッパースクリプトです。

* 3.4。 デプロイ可能なJAR *

展開のために、jarとその依存関係を別の場所に出荷する必要がある場合があります。
上記のセクションのラッパースクリプトは、_BazelApp.jar_’s起動コマンドの一部としてすべての依存関係(jarファイル)を指定します。
ただし、すべての依存関係を含むファットjarを作成することもできます。
$ bazel build //bazelapp:BazelApp_deploy.jar
ターゲットの名前に_“ _ deploy” _を付けると、Bazelにjar内のすべての依存関係をパッケージ化し、展開の準備をするよう指示します。

4. 依存関係

これまでのところ、_bazelapp._のファイルのみを使用してビルドしましたが、ほとんどのアプリには依存関係があります。
このセクションでは、jarファイルとともに依存関係をパッケージ化する方法について説明します。

* 4.1。 ライブラリの構築*

ただし、その前に、_bazelapp_が使用できる依存関係が必要です。
_bazelgreeting_という名前の別のMavenモジュールを作成し、_java_library_ルールで新しいモジュールの_BUILD_ファイルを構成しましょう。 このターゲットに「_greeter」_という名前を付けます。
java_library (
    name = "greeter",
    srcs = glob(["src/main/java/com/baeldung/*.java"])
)
ここでは、ライブラリの作成に_java_library_ルールを使用しました。 このターゲットをビルドした後、_libgreetings.jar_ファイルを取得します。
INFO: Found 1 target...
Target //bazelgreeting:greetings up-to-date:
  bazel-bin/bazelgreeting/libgreetings.jar

* 4.2。 依存関係の構成*

_bazelapp_で_greeter_を使用するには、いくつかの追加構成が必要です。 まず、パッケージを_bazelapp_から見えるようにする必要があります。 これを実現するには、_greeter_パッケージの_java_library_ルールに_visibility_属性を追加します。
java_library (
    name = "greeter",
    srcs = glob(["src/main/java/com/baeldung/*.java"]),
    visibility = ["//bazelapp:__pkg__"]
)
_visibility_属性は、現在のパッケージを配列にリストされているパッケージから見えるようにします。
_bazelapp_パッケージで、_greeter_パッケージへの依存関係を構成する必要があります。 _deps_属性を使用してこれを実行しましょう。
java_binary (
    name = "BazelApp",
    srcs = glob(["src/main/java/com/baeldung/*.java"]),
    main_class = "com.baeldung.BazelApp",
    deps = ["//bazelgreeting:greeter"]
)
_deps_属性は、現在のパッケージを配列にリストされているパッケージに依存させます。

5. 外部依存関係

複数のワークスペースを持ち、互いに依存するプロジェクトに取り組むことができます。 または、離れた場所からライブラリをインポートできます。 このような外部依存関係は次のように分類できます。
  • ローカルの依存関係:私たちは同じワークスペース内でそれらを管理します
    前のセクションで見た、または複数のワークスペースにまたがる

  • * HTTPアーカイブ*:ライブラリをリモートの場所からインポートします
    HTTP

    https://docs.bazel.build/versions/master/external.html [外部依存関係]を管理するために利用可能な多くのBazelルールがあります。 以降のセクションで、リモートロケーションからjarファイルをインポートする方法を説明します。

* 5.1。 HTTP URLロケーション*

この例では、https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.9/commons-lang3-3.9.jar [Apache Commons Lang]をアプリケーションにインポートします。 このjarをHTTPの場所からインポートする必要があるため、https://docs.bazel.build/versions/master/repo/http.html#http_jar [_http_jar_]ルールを使用します。 まず、Bazel HTTPビルド定義からルールをロードし、Apache Commonsの場所を使用して_WORKSPACE_ファイルでルールを構成します。
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_jar")

http_jar (
    name = "apache-commons-lang",
    url = "https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.9/commons-lang3-3.9.jar"
)
「_bazelapp」_パッケージの_BUILD_ファイルにさらに依存関係を追加する必要があります。
deps = ["//bazelgreeting:greeter", "@apache-commons-lang//jar"]
_WORKSPACE_ファイルの_http_jar_ルールで使用されているのと同じ名前を指定する必要があることに注意してください。

* 5.2。 Mavenの依存関係*

個々のjarファイルの管理は退屈な作業になります。 または、_WORKSPACE_ファイルでhttps://github.com/bazelbuild/rules_jvm_external[_rules_jvm_external_]ルール*を使用してMavenリポジトリを構成できます。 これにより、リポジトリからプロジェクトに必要な数の依存関係を取得できます。
まず、_WORKSPACE_ファイルの_http_archive_ルールを使用して、リモートの場所から_rules_jvm_external_ルールをインポートする必要があります。
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")

RULES_JVM_EXTERNAL_TAG = "2.0.1"
RULES_JVM_EXTERNAL_SHA = "55e8d3951647ae3dffde22b4f7f8dee11b3f70f3f89424713debd7076197eaca"

http_archive(
    name = "rules_jvm_external",
    strip_prefix = "rules_jvm_external-%s" % RULES_JVM_EXTERNAL_TAG,
    sha256 = RULES_JVM_EXTERNAL_SHA,
    url = "https://github.com/bazelbuild/rules_jvm_external/archive/%s.zip" % RULES_JVM_EXTERNAL_TAG,
)
次に、_maven_install_ルールを使用して、MavenリポジトリのURLと必要なアーティファクトを構成します。
load("@rules_jvm_external//:defs.bzl", "maven_install")

maven_install(
    artifacts = [
        "org.apache.commons:commons-lang3:3.9" ],
    repositories = [ 
        "https://repo1.maven.org/maven2",
    ] )
最後に、_BUILD_ファイルに依存関係を追加します。
deps = ["//bazelgreeting:greeter", "@maven//:org_apache_commons_commons_lang3"]
*アンダースコア(_)文字を使用して、アーティファクトの名前を解決します。*

6. 結論

このチュートリアルでは、Bazelビルドツールを使用してMavenスタイルのJavaプロジェクトをビルドするための基本的な構成を学びました。
ソースコードはhttps://github.com/eugenp/tutorials/tree/master/bazel[GitHub]からも入手できます。 Mavenプロジェクトとして存在し、Bazel _WORKSPACE_および_BUILD_ファイルで構成されています。