Skip to content

Migrate a Gradle Project

This tutorial walks through migrating a Gradle Java/Kotlin project to Bazel.

  • How to analyze a Gradle project
  • How to handle multi-module projects
  • How to map Gradle dependencies to Bazel
  • A Gradle project with build.gradle or build.gradle.kts
  • Bazel 9.x installed
  • rebaze binary

Consider a typical Gradle project:

  • Directorymyapp/
    • build.gradle.kts
    • settings.gradle.kts
    • Directoryapp/
      • build.gradle.kts
      • src/main/java/…
    • Directorylib/
      • build.gradle.kts
      • src/main/java/…

With settings.gradle.kts:

rootProject.name = "myapp"
include("app", "lib")
  1. Analyze the project

    Terminal window
    rebaze analyze myapp/

    Output:

    Detected build systems: gradle
  2. Preview the migration

    Terminal window
    rebaze migrate myapp/ --dry-run

    Shows generated files:

    MODULE.bazel
    module(name = "myapp", version = "0.1.0")
    bazel_dep(name = "rules_java", version = "...")
    app/BUILD.bazel
    java_binary(
    name = "app",
    srcs = glob(["src/main/java/**/*.java"]),
    deps = ["//lib"],
    )
    lib/BUILD.bazel
    java_library(
    name = "lib",
    srcs = glob(["src/main/java/**/*.java"]),
    visibility = ["//visibility:public"],
    )
  3. Run the migration

    Terminal window
    rebaze migrate myapp/
  4. Validate

    Terminal window
    rebaze validate myapp/

    Or:

    Terminal window
    cd myapp
    bazel build //...
    bazel test //...

Gradle dependencies are mapped to rules_jvm_external:

build.gradle.kts
dependencies {
implementation("com.google.guava:guava:32.1.3-jre")
testImplementation("junit:junit:4.13.2")
}

Generates:

MODULE.bazel
maven = use_extension("@rules_jvm_external//:extensions.bzl", "maven")
maven.install(
artifacts = [
"com.google.guava:guava:32.1.3-jre",
"junit:junit:4.13.2",
],
)
use_repo(maven, "maven")
BUILD.bazel
java_library(
name = "lib",
srcs = glob(["src/main/java/**/*.java"]),
deps = ["@maven//:com_google_guava_guava"],
)
GradleBazel
implementationdeps
apideps + exports
testImplementationtest target deps
compileOnlyneverlink = True
runtimeOnlyruntime_deps