1. .sbt build with .scala files example

.sbt build with .scala files example 

.sbt builds can be supplemented with project/*.scala files. When the build file gets large enough, the first thing to factor out are resolvers and dependencies.

project/Resolvers.scala 

import sbt._
import Keys._

object Resolvers {
 
val sunrepo    = "Sun Maven2 Repo" at "http://download.java.net/maven/2"
 
val sunrepoGF  = "Sun GF Maven2 Repo" at "http://download.java.net/maven/glassfish"
 
val oraclerepo = "Oracle Maven2 Repo" at "http://download.oracle.com/maven"

 
val oracleResolvers = Seq(sunrepo, sunrepoGF, oraclerepo)
}

project/Dependencies.scala 

import sbt._
import Keys._

object Dependencies {
 
val logbackVersion = "0.9.16"
 
val grizzlyVersion = "1.9.19"

 
val logbackcore    = "ch.qos.logback" % "logback-core"     % logbackVersion
 
val logbackclassic = "ch.qos.logback" % "logback-classic"  % logbackVersion

 
val jacksonjson = "org.codehaus.jackson" % "jackson-core-lgpl" % "1.7.2"

 
val grizzlyframwork = "com.sun.grizzly" % "grizzly-framework" % grizzlyVersion
 
val grizzlyhttp     = "com.sun.grizzly" % "grizzly-http"      % grizzlyVersion
 
val grizzlyrcm      = "com.sun.grizzly" % "grizzly-rcm"       % grizzlyVersion
 
val grizzlyutils    = "com.sun.grizzly" % "grizzly-utils"     % grizzlyVersion
 
val grizzlyportunif = "com.sun.grizzly" % "grizzly-portunif"  % grizzlyVersion

 
val sleepycat = "com.sleepycat" % "je" % "4.0.92"

 
val apachenet   = "commons-net"   % "commons-net"   % "2.0"
 
val apachecodec = "commons-codec" % "commons-codec" % "1.4"

 
val scalatest = "org.scalatest" %% "scalatest" % "3.2.17"
}

These files can be used mange library dependencies in one place.

project/ShellPromptPlugin.scala 

When you want to implement custom commands or tasks, you can organize your build by defining an one-off auto plugin.

import sbt._
import Keys._
import scala.sys.process._

// Shell prompt which show the current project and git branch
object ShellPromptPlugin extends AutoPlugin {
 
override def trigger = allRequirements
 
override lazy val projectSettings = Seq(
    shellPrompt
:= buildShellPrompt
 
)
 
val devnull: ProcessLogger = new ProcessLogger {
   
def out(s: => String): Unit = {}
   
def err(s: => String): Unit = {}
   
def buffer[T] (f: => T): T = f
 
}
 
def currBranch =
   
("git status -sb" lineStream_! devnull headOption)
     
.getOrElse("-").stripPrefix("## ")
 
val buildShellPrompt: State => String = {
   
case (state: State) =>
     
val currProject = Project.extract (state).currentProject.id
      s
"""$currProject:$currBranch> """
 
}
}

This auto plugin will display the current project name and the git branch.

build.sbt 

Now that we factored out custom settings and dependencies out to project/*.scala, we can make use of them in build.sbt:

import Resolvers._
import Dependencies._

// factor out common settings into a sequence
lazy val buildSettings = Seq(
  organization
:= "com.example",
  version
:= "0.1.0",
  scalaVersion
:= "2.12.18"
)

// Sub-project specific dependencies
lazy val commonDeps = Seq(
  logbackcore
,
  logbackclassic
,
  jacksonjson
,
  scalatest
% Test
)

lazy val serverDeps = Seq(
  grizzlyframwork
,
  grizzlyhttp
,
  grizzlyrcm
,
  grizzlyutils
,
  grizzlyportunif
,
  sleepycat
,
  scalatest
% Test
)

lazy val pricingDeps = Seq(
  apachenet
,
  apachecodec
,
  scalatest
% Test
)

lazy val cdap2 = (project in file("."))
 
.aggregate(common, server, compact, pricing, pricing_service)
 
.settings(buildSettings)

lazy val common = (project in file("cdap2-common"))
 
.settings(
    buildSettings
,
    libraryDependencies
++= commonDeps
 
)

lazy val server = (project in file("cdap2-server"))
 
.dependsOn(common)
 
.settings(
    buildSettings
,
    resolvers
:= oracleResolvers,
    libraryDependencies
++= serverDeps
 
)

lazy val pricing = (project in file("cdap2-pricing"))
 
.dependsOn(common, compact, server)
 
.settings(
    buildSettings
,
    libraryDependencies
++= pricingDeps
 
)  

lazy val pricing_service = (project in file("cdap2-pricing-service"))
 
.dependsOn(pricing, server)
 
.settings(buildSettings)

lazy val compatct = (project in file("compact-hashmap"))
 
.settings(buildSettings)