search term:

sbt 1.9.0

Hi everyone. On behalf of the sbt project, I am happy to announce sbt 1.9.0. This is the nineth feature release of sbt 1.x, a binary compatible release focusing on new features. sbt 1.x is released under Semantic Versioning, and the plugins are expected to work throughout the 1.x series. Please try it out, and report any issues you might come across.

The headline features of sbt 1.9.0 are:

How to upgrade

Download the official sbt runner from SDKMAN or download from to upgrade the sbt shell script and the launcher:

$ sdk install sbt 1.9.0

The sbt version used for your build is upgraded by putting the following in project/


This mechanism allows that sbt 1.9.0 is used only for the builds that you want.

Deprecation of IntegrationTest configuration

sbt 1.9.0 deprecates IntegrationTest configuration. (RFC-3 proposes to deprecate general use of configuration axis beyond Compile and Test, and this is the first installment of the change.)

The recommended migration path is to create a subproject named “integration”, or “foo-integration” etc.

lazy val integration = (project in file("integration"))
  .dependsOn(core) // your current subproject
    publish / skip := true,
    // test dependencies
    libraryDependencies += something % Test,

From the shell you can run:

> integration/test

Assuming these are slow tests compared to the regular tests, I might not aggregate them at all from other subprojects, and maybe only run it on CI, but it’s up to you.

Why deprecate IntegrationTest? IntegrationTest was a demoware for the idea of custom configuration axis, and now that we are planning to deprecate the mechanism to simplify sbt, we wanted to stop advertising it. We won’t remove it during sbt 1.x series, but deprecation signals the non-recommendation status.

This was contributed by @eed3si9n and @mdedetrich in lm#414/#7261.

Changes with compatibility implications

POM consistency of sbt plugin publishing

sbt 1.9.0 publishes sbt plugin to Maven repository in a POM-consistent way. sbt has been publishing POM file of sbt plugins as sbt-something-1.2.3.pom even though the artifact URL is suffixed as sbt-something_2.12_1.0. This allowed “sbt-something” to be registered by Maven Central, allowing search. However, as more plugins moved to Maven Central, it was considered that keeping POM consisntency rule was more important, especially for corporate repositories to proxy them.

sbt 1.9.0 will publish using both the conventional POM-inconsistent style and POM-consistent style so prior sbt releases can still consume the plugin. However, this can be opted-out using sbtPluginPublishLegacyMavenStyle setting.

This fix was contributed by Adrien Piquerez (@adpi2) at Scala Center in coursier#2633, sbt#7096 etc. Special thanks to William Narmontas (@ScalaWilliam) and Wudong Liu (@wudong) whose experimental plugin sbt-vspp paved the way for this feature.

sbt new, a text-based adventure

sbt 1.9.0 adds text-based menu when sbt new or sbt init is called without arguments:

$ sbt -Dsbt.version=1.9.0 init

Welcome to sbt new!
Here are some templates to get started:
 a) scala/toolkit.local               - Scala Toolkit (beta) by Scala Center and VirtusLab
 b) typelevel/toolkit.local           - Toolkit to start building Typelevel apps
 c) sbt/cross-platform.local          - A cross-JVM/JS/Native project
 d) scala/scala-seed.g8               - Scala 2 seed template
 e) playframework/play-scala-seed.g8  - A Play project in Scala
 f) playframework/play-java-seed.g8   - A Play project in Java
 g) scala-js/vite.g8                  - A Scala.JS + Vite project
 i) holdenk/sparkProjectTemplate.g8   - A Scala Spark project
 m) spotify/scio.g8                   - A Scio project
 n) disneystreaming/smithy4s.g8       - A Smithy4s project
 q) quit
Select a template (default: a):

Unlike Giter8, .local template creates build.sbt etc in the current directory, and reboots into an sbt session.

This was contributed by Eugene Yokota (@eed3si9n) in #7228.

Towards actionable diagnostics

sbt 1.9.0 adds actions field to Problem datatype, allowing the compiler to suggest code edits as part of the compiler warnings and errors in a structual manner.

See Roadmap for actionable diagnostics for more details. The changes were contributed by @ckipp01 in #7242 and @eed3si9n in bsp#527/#7251/zinc#1186 etc.

releaseNotesURL setting

sbt 1.9.0 adds releaseNotesURL setting, which creates info.releaseNotesUrl property in the POM file. This will then be used by Scala Steward. See Add release notes URLs to your POMs for details.

This was contributed by Arman Bilge in lm#410.

Other updates

Behind the scene


sbt 1.9.0 was brought to you by 24 contributors and two good bots: Eugene Yokota (eed3si9n), Scala Steward, Adrien Piquerez, Arman Bilge, Matthias Kurz, yoshinorin, Matthew de Detrich, Adriaan Moors, Chris Kipp, Iulian Dragos, Lukas Rytz, dependabot[bot], Anton Sviridov, Carston Schilds, Ethan Atkins, Jakub Kozłowski, Julien Richard-Foy, Kenji Yoshida (xuwei-k), Liang Yan, Marco Zühlke, Nicolas Rinaudo, Ryan Huddleston, Seth Tisue, Som Snytt, Vedant, msolomon-ck. Thanks!

Thanks to everyone who’s helped improve sbt and Zinc by using them, reporting bugs, improving our documentation, porting builds, porting plugins, and submitting and reviewing pull requests.

For anyone interested in helping sbt, there are many avenues for you to help, depending on your interest. If you’re interested, Contributing, “help wanted”, “good first issue”, and Discussions are good starting points.

🏳️‍🌈 Support Ukraine 🇺🇦

Forbidden Colours has started a fundraising campaign to support organisations in Poland, Hungary and Romania that are welcoming LGBTIQ+ refugees.

Scala Center is a non-profit center at EPFL to support education and open source.