Robust and featureful Bazel rules for Scala
Branch: master
Clone or download
Latest commit 2d5bae5 Feb 15, 2019

Bazel Scala Annex

Build Status


  1. Support the breadth of the Scala ecosystem.
  2. Follow Bazel best practices.
  3. Be accessible and maintainable.
  4. Have high-quality documentation.

If the right design principles are kept, implementing additional features should be simple and straightforward.


  • Basic library and binary rules
  • Single deploy jar
  • Works with all sbt-compatible test frameworks
  • Multiple Scala versions in one build
  • Macros
  • ijars
  • REPL
  • Automatic main method detection
  • Errors on indirect and unused dependencies
  • Buildozer suggestions for dependency erors
  • Scalafmt
  • ScalaPB
  • Worker strategy
  • Optional Zinc-based stateful incremental compilation
  • IntelliJ Bazel plugin integration

Differences with rules_scala

  • More correctly handles of macros and ijars. See #445 and #632.
    • Detect missing macro = True attribute. See #366.
  • More precisely and straightforwardly detects indirect and unused dependencies, via Zinc. See #235 and #335.
  • Supports neverlink. See #213.
  • Optionally allows for fine-grained incrementality with stateful Zinc compilation. See bazel-discuss and #328.
  • Does not support intransitive classpaths, matching Java rules. See #432.
  • Tools written in Scala, using bootstrapping rules as necessary.
  • Uses depset and Args to completely defer expanding transitive dependency lists until execution time.
  • Supports many Scala versions: 2.10-2.13, Typelevel, Dotty, and anything else compatible with Zinc's compiler-bridge.
  • Allows for multiple Scala versions in the same workspace. See #80 and #393.
    • For example, rules_scala_annex tools use Scala 2.12, but that doesn't affect any client projects.
  • Robustly supports buildozer recommendations via an aspect.
  • Supports for all Scala test frameworks via sbt test-interface.
  • Support test sharding, custom test framework arguments (including options to the JVM itself).
  • Supports optional classloader and process-level isolation for tests, similar to sbt's fork := true.
  • Supports scalafmt.
  • Supports Scaladoc. See #230 and #256.
  • Has consistently formatted code, via buildifier and scalafmt. See #74.
  • Reorganized and simplified file and code structure. Less than 8 KLOC excluding tests and dependency resolutions. (git ls-files | grep -v '^test\|/maven.bzl$\|*.md' | xargs cat | wc -l)
  • Reorganized Travis CI builds, including better cache reuse.
  • Easy dependency managment of internal tools using bazel-deps.
  • Tested against three most recent Bazel versions.


Note: the rules are undergoing refactoring and the following configuration is only valid up to commit 6829904caaac3160636a7e30acd8bd500357e742. Expect updated documentation soon.


    name = "bazel_skylib",
    sha256 = "c0289fef5237c31e8462042b4cc3bdf831a3d3d135bb4a0d493a5072acecb074",
    strip_prefix = "bazel-skylib-2169ae1c374aab4a09aa90e65efe1a3aad4e279b",
    urls = [""],

    name = "com_google_protobuf",
    sha256 = "2c8f8614fb1be709d68abaab6b4791682aa7db2048012dd4642d3a50b4f67cb3",
    strip_prefix = "protobuf-0038ff49af882463c2af9049356eed7df45c3e8e",
    urls = [""],

  name = "rules_scala_annex",
  sha256 = "<hash>",
  strip_prefix = "rules_scala_annex-<commit>",
  url = "<commit>.zip",

load("@rules_scala_annex//rules/scala:workspace.bzl", "scala_register_toolchains", "scala_repository", "scala_repositories")


# Add a @scala repo, which is the default scala provider used by scala_*
scala_repository("scala", ("org.scala-lang", "2.12.4"), "@compiler_bridge_2_12//:src")


load("@rules_scala_annex//rules:scala.bzl", "scala_library")

  name = "example",
  srcs = glob(["**/*.scala"])

Further Documentation

See contributing guidlines for help on contributing to this project.

For all rules and attributes, see the Stardoc.