Fix mixed UTF-8 Java and Kotlin builds (#178)

When building .java files using the native Java rules, the environment
variable LC_LANG=en_US.UTF-8 is explicitely set for the actual build
action, see:

When building a mixed Kotlin + Java module on Linux, the .java sources
are not handled by the native Java rules, and as a result are treated as
encoded using US-ASCII due to sandboxing which strips the environment
from all locale information, causing the compiler to default to the
'C' locale.

This patch adds this environment variable when building Kotlin + Java
modules and has no side effects on Kotlin-only modules as UTF-8 is the
only valid encoding for .kt source files.
1 file changed
tree: b0973b439cccf3af37b20f11f1bdd6821369897b
  1. .bazelci/
  2. docs/
  3. examples/
  4. kotlin/
  5. scripts/
  6. src/
  7. third_party/
  8. .bazelproject
  9. .bazelrc
  10. .gitignore
  12. BUILD
  17. Makefile

Build status

Skydoc documentation


  • February 20, 2019. Future directions of rules_kotlin.
  • August 14, 2018. Js support. No documentation yet but see the nested example workspace examples/node.
  • August 14, 2018. Android support. No documentation but it's a simple integration. see kotlin/internal/jvm/android.bzl.
  • Jun 29, 2018. The commits from this date forward are compatible with bazel >=0.14. JDK9 host issues were fixed as well some other deprecations. I recommend skipping 0.15.0 if you are on a Mac.
  • May 25, 2018. Test “friend” support. A single friend dep can be provided to kt_jvm_test which allows the test to access internal members of the module under test.
  • February 15, 2018. Toolchains for the JVM rules. Currently this allow tweaking:
    • The JVM target (bytecode level).
    • API and Language levels.
    • Coroutines, enabled by default.
  • February 9, 2018. Annotation processing.
  • February 5, 2018. JVM rule name change: the prefix has changed from kotlin_ to kt_jvm_.


These rules were initially forked from pubref/rules_kotlin. Key changes:

  • Replace the macros with three basic rules. kt_jvm_binary, kt_jvm_library and kt_jvm_test.
  • Use a single dep attribute instead of java_dep and dep.
  • Add support for the following standard java rules attributes:
    • data
    • resource_jars
    • runtime_deps
    • resources
    • resources_strip_prefix
    • exports
  • Persistent worker support.
  • Mixed-Mode compilation (compile Java and Kotlin in one pass).

Quick Guide

This section just contains a quick overview. Consult the generated documentation. Note: Skydoc documentation is no longer being generated. Comprehensive documentation will have to wait till the new documentation generation tool is ready. A contribution to port the documentation to the RST format like rules_go has would be very welcome !


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 = "67f4a6050584730ebae7f8a40435a209f8e0b48e"

    name = "io_bazel_rules_kotlin",
    urls = ["" % rules_kotlin_version],
    type = "zip",
    strip_prefix = "rules_kotlin-%s" % rules_kotlin_version

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

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 = [


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.