Java と Bazel

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

このページには、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。デフォルト値は 11remotejdk_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 ツールチェーンの構成

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: デフォルトと同じ。ただし、事前ビルド済みのもののみを使用 ツール(ijarsinglejar
  • NONPREBUILT_TOOLCHAIN_CONFIGURATION: デフォルトと同じ。ただし、すべてのツールが (これは、オペレーティング システムのバージョンが異なる場合がある libc など)

JVM コンパイラ フラグと Java コンパイラ フラグの構成

JVM フラグと javac フラグは、フラグを使用するか、 default_java_toolchain 属性。

関連するフラグは、--jvmopt--host_jvmopt--javacopt--host_javacopt

関連する default_java_toolchain 属性は、javacoptsjvm_optsjavabuilder_jvm_optsturbine_jvm_opts

パッケージ固有の Java コンパイラ フラグの構成

特定のソースごとに異なる Java コンパイラ フラグを構成できる default_java_toolchainpackage_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