Skip to content
Bazel rules for Kotlin
Kotlin Python Java Other
Branch: master
Clone or download
Latest commit 4512a83 Jan 17, 2020
Type Name Latest commit message Commit time
Failed to load latest commit information.
.bazelci Stop passing source jars in kt_jvm_import() to the DefaultInfo(files=… Oct 28, 2019
examples Stop using native java rules (#258) Jan 15, 2020
kotlin Stop using native java rules (#258) Jan 15, 2020
scripts Newline at end of file, per review comment. Oct 10, 2019
third_party Stop using native java rules (#258) Jan 15, 2020
.bazelignore Stop passing source jars in kt_jvm_import() to the DefaultInfo(files=… Oct 28, 2019
.bazelproject consolate all srcs under src Aug 17, 2018
.bazelrc regenerate the documentation and remove deprecated startup option rem… Jul 4, 2018
.gitignore Use regular expressions to match JS filenames in kt_js_import. (#223) Oct 28, 2019
AUTHORS Update AUTHORS Jan 31, 2018
CODEOWNERS Add cgruber to codeowners, since he has commit rights to the main repo Oct 1, 2019 Fix contributing doc. Oct 3, 2019
CONTRIBUTORS initial import from hsyed/rules_kotlin Jan 31, 2018
Makefile Add a link to the generated documentation (#237) Jan 16, 2020 Create Apr 2, 2019
WORKSPACE Factor out external workspace versions and SHA256s into variables con… Jan 17, 2020
renovate.json Add renovate.json (#176) Mar 20, 2019

Build Status

Bazel Kotlin Rules

Current release: legacy-1.3.0-rc4
Main branch: master


  • Jan 15, 2020. Released version 1.3.0-rc4.
  • Jan 15, 2020. Bug fixes and tweaks (#255, #257).
  • Dec 6, 2019. Released version 1.3.0-rc3.
  • Dec 6, 2019. Add support for later java versions as target platforms (#236).
  • Dec 5, 2019. Released version 1.3.0-rc2.
  • Dec 5, 2019. Fix for problem with jdeps generation (#235).
  • Oct 29, 2019. Released version 1.3.0-rc1.
  • Oct 5, 2019. upstreamed into this repository.

For older news, please see Changelog


rules_kotlin supports the basic paradigm of *_binary, *_library, *_test of other Bazel language rules. It also supports jvm, android, and js flavors, with the prefix kt_jvm and kt_js, and kt_android typically applied to the rules (the exception being kt_android_local_test, which doesn't exist. Use an android_local_test that takes a kt_android_library as a dependency).

Limited "friend" support is available, in the form of tests being friends of their library for the system under test, allowing internal access to types and functions.

Also, kt_jvm_* rules support the following standard java_* rules attributes:

  • data
  • resource_jars
  • runtime_deps
  • resources
  • resources_strip_prefix
  • exports

Android rules also support custom_package for generation, manifest=, resource_files, etc.

Other features:

  • Persistent worker support.
  • Mixed-Mode compilation (compile Java and Kotlin in one pass).
  • Configurable Kotlinc distribtution and version
  • Configurable Toolchain
  • Kotlin 1.3 support

Javascript is reported to work, but is not as well maintained (at present)


Generated API documentation is available at

Quick Guide


In the project's WORKSPACE, declare the external repository and initialize the toolchains, like this:

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")

rules_kotlin_version = "legacy-1.3.0-rc4"
rules_kotlin_sha = "fe32ced5273bcc2f9e41cea65a28a9184a77f3bc30fea8a5c47b3d3bfc801dff"
    name = "io_bazel_rules_kotlin",
    urls = ["" % rules_kotlin_version],
    type = "zip",
    strip_prefix = "rules_kotlin-%s" % rules_kotlin_version,
    sha256 = rules_kotlin_sha,

load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kotlin_repositories", "kt_register_toolchains")
kotlin_repositories() # if you want the default. Otherwise see custom kotlinc distribution below
kt_register_toolchains() # to use the default toolchain, otherwise see toolchains below

BUILD files

In your project's BUILD files, load the Kotlin rules and use them like so:

load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_jvm_library")

    name = "package_name",
    srcs = glob(["*.kt"]),
    deps = [

Custom toolchain

To enable a custom toolchain (to configure language level, etc.) do the following. In a <workspace>/BUILD.bazel file define the following:

load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "define_kt_toolchain")

    name = "kotlin_toolchain",
    api_version = KOTLIN_LANGUAGE_LEVEL,  # "1.1", "1.2", or "1.3"
    jvm_target = JAVA_LANGUAGE_LEVEL, # "1.6", "1.8", "9", "10", "11", or "12",
    language_version = KOTLIN_LANGUAGE_LEVEL,  # "1.1", "1.2", or "1.3"

and then in your WORKSPACE file, instead of kt_register_toolchains() do


Custom kotlinc distribution (and version)

To choose a different kotlinc distribution (only 1.3 variants supported), do the following in your WORKSPACE file (or import from a .bzl file:

load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kotlin_repositories")

KOTLINC_RELEASE_SHA = "107325d56315af4f59ff28db6837d03c2660088e3efeb7d4e41f3e01bb848d6a"

    "urls": [
        "{v}/kotlin-compiler-{v}.zip".format(v = KOTLIN_VERSION),
    "sha256": KOTLINC_RELEASE_SHA,

kotlin_repositories(compiler_release = KOTLINC_RELEASE)

Third party dependencies

(e.g. Maven artifacts)

Third party (external) artifacts can be brought in with systems such as rules_jvm_external or bazel_maven_repository or bazel-deps, but make sure the version you use doesn't naively use java_import, as this will cause bazel to make an interface-only (ijar), or ABI jar, and the native ijar tool does not know about kotlin metadata with respect to inlined functions, and will remove method bodies inappropriately. Recent versions of rules_jvm_external and bazel_maven_repository are known to work with Kotlin.


Examples can be found in the examples directory, including usage with Android, Dagger, Node-JS, etc.


These rules were initially forked from pubref/rules_kotlin, and then re-forked from bazelbuild/rules_kotlin. They were merged back into this repository in October, 2019.


This project is licensed under the Apache 2.0 license, as are all contributions


See the CONTRIBUTING doc for information about how to contribute to this project.

You can’t perform that action at this time.