Bazelを使用したJavaアプリケーションの構築
1. 概要
Bazel は、MavenやGradleと同様に、ソースコードをビルドおよびテストするためのオープンソースツールです。 複数の言語のプロジェクトをサポートし、複数のプラットフォームの出力を構築します。
このチュートリアルでは、Bazelを使用して単純なJavaアプリケーションを構築するために必要な手順を説明します。 説明のために、マルチモジュールのMavenプロジェクトから始めて、Bazelを使用してソースコードをビルドします。
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ファイルです。 各ルールを一意のターゲット名前で識別します。
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つで構成されたターゲット名です。 「 //
パターンの最初の部分「//」は、ワークスペースディレクトリから開始していることを示します。 次の“ 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 の起動コマンドの一部としてすべての依存関係(jarファイル)を指定します。
ただし、すべての依存関係を含むファットjarを作成することもできます。
$ bazel build //bazelapp:BazelApp_deploy.jar
ターゲットの名前に“ _ deploy” を付けると、すべての依存関係をjar 内にパッケージ化し、デプロイの準備をするようにBazelに指示します。
4. 依存関係
これまでのところ、次のファイルのみを使用してビルドしました
このセクションでは、依存関係を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経由でライブラリをインポートします
外部依存関係を管理するために利用できる多くのBazelルールがあります。 以降のセクションで、リモートの場所からjarファイルをインポートする方法を説明します。
5.1. HTTPURLの場所
この例では、 Apache CommonsLangをアプリケーションにインポートしてみましょう。 このjarをHTTPの場所からインポートする必要があるため、http_jarルールを使用します。 まず、Bazel HTTPビルド定義からルールをロードし、ApacheCommonsの場所を使用して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.12.0/commons-lang3-3.12.0.jar"
)
「bazelapp」パッケージのBUILDファイルに依存関係をさらに追加する必要があります。
deps = ["//bazelgreeting:greeter", "@apache-commons-lang//jar"]
WORKSPACEファイルからhttp_jarルールで使用されているのと同じ名前を指定する必要があることに注意してください。
5.2. Mavenの依存関係
個々のjarファイルの管理は面倒な作業になります。 または、WORKSPACEファイルのrules_jvm_externalruleを使用して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.12.0" ],
repositories = [
"https://repo1.maven.org/maven2",
] )
最後に、BUILDファイルに依存関係を追加します。
deps = ["//bazelgreeting:greeter", "@maven//:org_apache_commons_commons_lang3"]
アンダースコア(_)文字を使用してアーティファクトの名前を解決します。
6. 結論
このチュートリアルでは、Bazelビルドツールを使用してMavenスタイルのJavaプロジェクトをビルドするための基本的な構成を学習しました。
ソースコードはGitHubからも入手できます。 これはMavenプロジェクトとして存在し、Bazel WORKSPACEおよびBUILDファイルで構成されています。