scala / sbt-scala-module

sbt plugin for scala modules.

Version Matrix

Scala modules sbt plugin

This is an sbt 1.x plugin for building Scala modules.

What modules use it?

Why this plugin?

Having a shared plugin reduces duplication between the above repositories. Reducing duplication makes maintenance easier and helps ensure consistency.

A major feature of the plugin is automated tag-based publishing using sbt-ci-release. A release is made by pushing a tag to GitHub.

The plugin also brings in

  • sbt-dynver to set the version based on the git history
  • sbt-version-policy to check the versioning policy using MiMa
  • sbt-header to automate copyright header maintenance
  • sbt-osgi, if enabled with scalaModuleOsgiSettings


Add the plugin to the project/plugins.sbt file:

addSbtPlugin("org.scala-lang.modules" % "sbt-scala-module" % <version>)

Then, in your build.sbt add:

// In a multi-project build, you might want to apply these settings only to the
// main project (see e.g. scala-parallel-collections)

// If making an OSGi bundle

name         := "<module name>"
repoName     := "<GitHub repo name>" // the repo under, only required if different from name
organization := "<org>"              // only required if different from "org.scala-lang.modules"

versionPolicyIntention := Compatibility.BinaryAndSourceCompatible // enables MiMa (`Compatibility.None` by default, which disables it)

OsgiKeys.exportPackage := Seq(s"<exported package>;version=${version.value}")

// Other settings

Cross-building with Scala.js and Scala Native is possible. See scala-xml or scala-parser-combinators for examples.

These additional settings are enabled by scalaModuleSettings:

  • Compile / compile / scalacOptions ++= Seq("-feature", "-deprecation", "-unchecked", "-Xlint")
  • A file is generated and packaged
  • Test / fork := true to work around some classpath clashes with scala-xml
  • POM metadata

The following settings are also available:

  • enableOptimizer adds -opt-inline-from:<sources> or -opt:l:project or -optimize to Compile / compile / scalacOptions, depending on the Scala version

Set up tag-based publishing

The instructions here are a summary of the readme in and

  • Create a fresh GPG key: gpg --gen-key

  • Get the key LONG_ID from the output and set LONG_ID=6E8ED79B03AD527F1B281169D28FC818985732D9. The output looks like this:

    pub   rsa2048 2018-06-10 [SC] [expires: 2020-06-09]
  • Copy the public key to a key server

  • In your repo's Actions settings, define four secret env vars

    • PGP_PASSPHRASE the passphrase you chose above
    • PGP_SECRET the secret key in base64
      • macOS: gpg --armor --export-secret-keys $LONG_ID | base64
      • ubuntu: gpg --armor --export-secret-keys $LONG_ID | base64 -w0
    • SONATYPE_PASSWORD: need that one
    • SONATYPE_USERNAME: that one too
  • Run versionCheck in the publishing process: sbt versionCheck ci-release