このページには、Java プロジェクトで Bazel を使用する場合に役立つリソースが記載されています。これは、 チュートリアル、ビルドルール、ビルドに固有のその他の情報へのリンク Bazel を使用した Java プロジェクト。
Bazel の使用
Java プロジェクトで Bazel を使用する際は、次のリソースをご覧ください。
Bazel への移行
現在 Maven を使用して Java プロジェクトをビルドしている場合は、 Bazel を使用した Maven プロジェクトのビルドを開始するための移行ガイド:
Java のバージョン
構成フラグが設定された Java には、次の 2 つの関連バージョンがあります。
- リポジトリ内のソースファイルのバージョン
- コードの実行とテストに使用される Java ランタイムのバージョン
リポジトリ内のソースコードのバージョンを構成する
追加構成がない場合、Bazel は
単一の Java バージョンで記述します。使用するコンテナのバージョンを
リポジトリ内のソースが build --java_language_version={ver}
を以下に追加する
.bazelrc
ファイル({ver}
は 11
など)。Bazel リポジトリのオーナー
このフラグを設定して、Bazel とそのユーザーがソースコードの参照を
Java のバージョン番号。詳しくは、
Java 言語バージョン フラグ。
コードの実行とテストに使用する JVM を構成する
Bazel は、コンパイルに JDK を使用し、コードの実行とテストに別の JVM を使用します。
デフォルトでは、Bazel は JDK を使用してコードをコンパイルし、ダウンロードして実行し、
ローカルマシンにインストールされている JVM を使用してコードをテストします。Bazel による検索
JAVA_HOME
またはパスを使用して JVM を起動できます。
生成されたバイナリは、システムにローカルにインストールされた JVM と互換性がある つまりバイナリは、コンテナ上にインストールされたものによって あります。
実行とテストに使用する JVM を構成するには、--java_runtime_version
を使用します。
設定されます。デフォルト値は local_jdk
です。
密閉型のテストとコンパイル
密閉コンパイルを作成するには、コマンドライン フラグ
--java_runtime_version=remotejdk_11
。コードをコンパイルして実行し、
リモート リポジトリからダウンロードした JVM でテストできます。詳しくは、
Java ランタイム バージョン フラグ。
Java でのビルドツールのコンパイルと実行の設定
もう一つの JDK と JVM のペアは、ツールのビルドと実行に使用されます。
使用されますが、ビルド結果には反映されません。その JDK と JVM
--tool_java_language_version
を使用して制御され、
--tool_java_runtime_version
。デフォルト値は 11
と remotejdk_11
です。
できます。
ローカルにインストールされた JDK を使用したコンパイル
Bazel は JDK をオーバーライドするため、デフォルトではリモート JDK を使用してコンパイルされます 説明します。ローカルにインストールされた JDK を使用するコンパイル ツールチェーンが構成されている。 使用されません。
ローカルにインストールされた JDK を使用してコンパイルするには、コンパイル ツールチェーンを使用します。
ローカル JDK の場合は、追加のフラグ --extra_toolchains=@local_jdk//:all
を使用します。
ただし、任意のベンダーの JDK では動作しない場合があります。
詳しくは、 Java ツールチェーンの構成をご覧ください。
ベスト プラクティス
Bazel の一般的なベスト プラクティスに加えて、以下があります。 ベスト プラクティスを確認する。
ディレクトリ構造
Maven の標準ディレクトリ レイアウトを優先する(src/main/java
にあるソース、テスト)
src/test/java
未満)。
BUILD ファイル
BUILD
ファイルを作成する際は、次のガイドラインに従ってください。
Java ソースを含むディレクトリごとに 1 つの
BUILD
ファイルを使用します。これは、 ビルドのパフォーマンスが向上します。すべての
BUILD
ファイルには、次のようなjava_library
ルールが 1 つ含まれている必要があります。 これを次のように使用します。java_library( name = "directory-name", srcs = glob(["*.java"]), deps = [...], )
ライブラリの名前は、ファイルが格納されているディレクトリの名前にする必要があります。
BUILD
ファイル。これにより、ライブラリのラベルが短くなります。"//package:package"
を"//package"
に変更。ソースは、次の再帰的でない
glob
にする必要があります。 ディレクトリ内のすべての Java ファイルを取得します。テストは
src/test
の下の一致するディレクトリに配置し、これに依存する必要があります。 ライブラリです。
高度な Java ビルド用の新しいルールの作成
注: 新しいルールの作成は、高度なビルドとテストのシナリオを対象とします。あなたは Bazel を初めて使用する場合は不要です。
以下のモジュール、構成フラグメント、プロバイダは、 Java のビルド時に Bazel の機能を拡張する プロジェクト:
- メイン Java モジュール:
java_common
- メインの Java プロバイダ:
JavaInfo
- 構成フラグメント:
java
その他のモジュール:
Java ツールチェーンの構成
Bazel では、次の 2 種類の Java ツールチェーンを使用します。
- Java バイナリの実行とテストに使用する実行。Compute Engine インスタンス
--java_runtime_version
フラグ
- Java ソースのコンパイルに使用するコンパイル
--java_language_version
フラグ
追加の実行ツールチェーンの構成
実行ツールチェーンはローカルまたはリポジトリからの JVM です。 バージョン、オペレーティング システム、CPU に関する追加情報 説明します。
Java 実行ツールチェーンは、local_java_repository
または
WORKSPACE
ファイルの remote_java_repository
ルール。ルールを追加すると、
使用して JVM を表示します。同じオペレーションに対して複数の定義がある場合、
CPU アーキテクチャが指定されている場合、最初のものが使用されます。
ローカル JVM の構成例:
load("@bazel_tools//tools/jdk:local_java_repository.bzl", "local_java_repository")
local_java_repository(
name = "additionaljdk", # Can be used with --java_runtime_version=additionaljdk, --java_runtime_version=11 or --java_runtime_version=additionaljdk_11
version = 11, # Optional, if not set it is autodetected
java_home = "/usr/lib/jdk-15/", # Path to directory containing bin/java
)
リモート JVM の構成例:
load("@bazel_tools//tools/jdk:remote_java_repository.bzl", "remote_java_repository")
remote_java_repository(
name = "openjdk_canary_linux_arm",
prefix = "openjdk_canary", # Can be used with --java_runtime_version=openjdk_canary_11
version = "11", # or --java_runtime_version=11
target_compatible_with = [ # Specifies constraints this JVM is compatible with
"@platforms//cpu:arm",
"@platforms//os:linux",
],
urls = ..., # Other parameters are from http_repository rule.
sha256 = ...,
strip_prefix = ...
)
追加のコンパイル ツールチェーンの構成
コンパイル ツールチェーンは、JDK と、Bazel が使用する複数のツールで構成されます。 次のような追加機能が提供されます: Error 傾向がある、厳格な Java 依存関係、ヘッダーのコンパイル、Android の desugar、 カバレッジ インストゥルメンテーション、IDE の genclass 処理
JavaBuilder は Bazel にバンドルされたツールで、コンパイルを実行します。
説明しました実際のコンパイルは、内部
実行されています。コンパイルに使用される JDK が java_runtime
によって指定される
ツールチェーンの属性を使用します。
Bazel は一部の JDK 内部をオーバーライドします。JDK バージョンの場合 >9、
java.compiler
モジュールと jdk.compiler
モジュールには、JDK のフラグを使用してパッチが適用されます。
--patch_module
。JDK バージョン 8 の場合、Java コンパイラにパッチを適用するには、
-Xbootclasspath
フラグ。
VanillaJavaBuilder は、JavaBuilder の 2 つ目の実装です。 JDK の内部コンパイラを変更せず、 追加機能。VanillaJavaBuilder は、 統合できます。
Bazel は、JavaBuilder 以外にもコンパイル時に複数のツールを使用します。
ijar
ツールは jar
ファイルを処理して、次の呼び出し以外のすべてを削除します。
できます。生成される JAR はヘッダー JAR と呼ばれます。これらは
コンパイル時のみにダウンストリームの依存先を再コンパイルすることで、
変更されることです。
singlejar
ツールは、複数の jar
ファイルを 1 つにまとめます。
genclass
ツールは、Java コンパイルの出力を後処理し、次のものを生成します。
生成されたソースのクラスファイルのみを含む jar
アノテーション プロセッサ
JacocoRunner
ツールは、インストゥルメント化されたファイルに対して Jacoco を実行し、結果を
。
TestRunner
ツールは、制御された環境で JUnit 4 テストを実行します。
コンパイルを再構成するには、default_java_toolchain
マクロを
BUILD
ファイルを作成し、register_toolchains
ルールを追加して登録する
WORKSPACE
ファイルまたは
--extra_toolchains
フラグ。
ツールチェーンは、source_version
属性が
--java_language_version
フラグで指定された値。
ツールチェーン構成の例:
load(
"@bazel_tools//tools/jdk:default_java_toolchain.bzl",
"default_java_toolchain", "DEFAULT_TOOLCHAIN_CONFIGURATION", "BASE_JDK9_JVM_OPTS", "DEFAULT_JAVACOPTS"
)
default_java_toolchain(
name = "repository_default_toolchain",
configuration = DEFAULT_TOOLCHAIN_CONFIGURATION, # One of predefined configurations
# Other parameters are from java_toolchain rule:
java_runtime = "@bazel_tools//tools/jdk:remote_jdk11", # JDK to use for compilation and toolchain's tools execution
jvm_opts = BASE_JDK9_JVM_OPTS + ["--enable_preview"], # Additional JDK options
javacopts = DEFAULT_JAVACOPTS + ["--enable_preview"], # Additional javac options
source_version = "9",
)
これは --extra_toolchains=//:repository_default_toolchain_definition
を使用して使用できます。
または register_toolchains("//:repository_default_toolchain_definition")
を追加します
課題となります
事前定義された構成:
DEFAULT_TOOLCHAIN_CONFIGURATION
: すべての機能、9 以上の JDK バージョンをサポートVANILLA_TOOLCHAIN_CONFIGURATION
: 追加機能なし。次の JDK をサポートします。 任意のベンダーです。PREBUILT_TOOLCHAIN_CONFIGURATION
: デフォルトと同じ。ただし、事前ビルド済みのもののみを使用 ツール(ijar
、singlejar
)NONPREBUILT_TOOLCHAIN_CONFIGURATION
: デフォルトと同じ。ただし、すべてのツールが (これは、オペレーティング システムのバージョンが異なる場合がある libc など)
JVM コンパイラ フラグと Java コンパイラ フラグの構成
JVM フラグと javac フラグは、フラグを使用するか、
default_java_toolchain
属性。
関連するフラグは、--jvmopt
、--host_jvmopt
、--javacopt
、
--host_javacopt
。
関連する default_java_toolchain
属性は、javacopts
、jvm_opts
、
javabuilder_jvm_opts
、turbine_jvm_opts
。
パッケージ固有の Java コンパイラ フラグの構成
特定のソースごとに異なる Java コンパイラ フラグを構成できる
default_java_toolchain
の package_configuration
属性を使用しているファイル。
以下の例を参照してください。
load("@bazel_tools//tools/jdk:default_java_toolchain.bzl", "default_java_toolchain")
# This is a convenience macro that inherits values from Bazel's default java_toolchain
default_java_toolchain(
name = "toolchain",
package_configuration = [
":error_prone",
],
visibility = ["//visibility:public"],
)
# This associates a set of javac flags with a set of packages
java_package_configuration(
name = "error_prone",
javacopts = [
"-Xep:MissingOverride:ERROR",
],
packages = ["error_prone_packages"],
)
# This is a regular package_group, which is used to specify a set of packages to apply flags to
package_group(
name = "error_prone_packages",
packages = [
"//foo/...",
"-//foo/bar/...", # this is an exclusion
],
)
単一のリポジトリ内に複数のバージョンの Java ソースコード
Bazel では、ビルド内での Java ソースのコンパイルは 1 バージョンのみをサポートしています。 構築できます。つまり、Java テストやアプリケーションを構築する際には、 同じ Java バージョンに対してビルドされます。
ただし、異なるフラグを使用して別々のビルドを実行することもできます。
さまざまなフラグを使用するタスクを容易にするために、特定のリソースに
バージョンは .bazelrc
構成でグループ化できます":
build:java8 --java_language_version=8
build:java8 --java_runtime_version=local_jdk_8
build:java11 --java_language_version=11
build:java11 --java_runtime_version=remotejdk_11
これらの構成ファイルは、--config
フラグとともに使用できます。次に例を示します。
bazel test --config=java11 //:java11_test
。