Create a basic empty SBT project
mkdir -p new-project cd new-project mkdir -p project echo 'sbt.version=1.4.9' > project/build.properties
Compile the project
sbt compile
Recompile on code change
sbt '~compile'
~
watches for code changes. Press Enter to exit.
Create a source file
Run this command in another terminal window.
mkdir -p src/main/scala/ cat > src/main/scala/SimpleApp.scala << EOF object SimpleApp extends App { println("It works") } EOF
Run continuously
Exit the ~compile
command by pressing Enter
sbt '~run'
Change source to verify it works
sed -i -e 's/works/definitely works/' \ src/main/scala/SimpleApp.scala
Add ScalaTest
echo 'libraryDependencies += "org.scalatest" %%' \ '"scalatest" % "3.2.6" % Test' >> build.sbt
Create a test
mkdir -p src/test/scala/ cat > src/test/scala/SimpleTest.scala << EOF import org.scalatest.funsuite._ final class SimpleTest extends AnyFunSuite { def sum(a: Int, b: Int): Int = ??? test("sum works for 1 + 2 = 3") { assert(sum(1, 2) == 3) } } EOF
Test continuously
Exit previous ~run
command by pressing Enter
sbt '~test'
Make it pass
sed -i -e 's/???/a + b/' src/test/scala/SimpleTest.scala
Use Scala 2.13
echo 'scalaVersion in ThisBuild := "2.13.5"' >> build.sbt
Add the sbt-native-packager plugin
echo 'addSbtPlugin("com.typesafe.sbt" % '\ '"sbt-native-packager" % "1.8.1")' \ > project/plugins.sbt
Enable sbt-native-packager
echo 'enablePlugins(JavaAppPackaging)' >> build.sbt
Package the app
sbt 'show dist'
Run packaged app
unzip -o -d /tmp/my-project \ ./target/universal/new-project-0.1.0-SNAPSHOT.zip /tmp/my-project/new-project-0.1.0-SNAPSHOT/bin/new-project
Dockerize your app
sbt docker:publishLocal
Run the docker image
docker run new-project:0.1.0-SNAPSHOT
Create a submodule
echo 'lazy val fizzbuzz = project' >> build.sbt
Compile the submodule
sbt fizzbuzz/compile
Add ScalaTest to submodule
echo ' .settings(libraryDependencies += "org.scalatest"' \ '%% "scalatest" % "3.2.6" % Test)' >> build.sbt
Continually test the submodule
sbt '~fizzbuzz/test'
Create a method in the submodule
mkdir -p fizzbuzz/src/main/scala/ cat > fizzbuzz/src/main/scala/Fizz.scala << EOF object Fizz { def buzz(n: Int): String = ??? } EOF
Create a test in the submodule
mkdir -p fizzbuzz/src/test/scala/ cat > fizzbuzz/src/test/scala/FizzTest.scala << EOF import org.scalatest.funsuite._ final class FizzTest extends AnyFunSuite { test("fizzBuzz for 4 is 4") { assert(Fizz.buzz(4) == "4") } } EOF
Pass the test
sed -i -e 's/???/s"$n"/' \ fizzbuzz/src/main/scala/Fizz.scala
Make the app depend on the submodule
echo 'dependsOn(fizzbuzz)' >> build.sbt
Use the submodule in the app
sed -i -e 's/".*"/Fizz.buzz(args.last.toInt)/'\ src/main/scala/SimpleApp.scala
Run the app with arguments
sbt "run --- 123"
Explicitly name the project
echo 'name := "new-project"' >> build.sbt
Explicitly version the project
echo 'version := "0.2"' >> build.sbt
Add JSoup Java library to main project
echo 'libraryDependencies += "org.jsoup" % "jsoup"' \ '% "1.13.1"' >> build.sbt
Print all BBC News headlines
mkdir -p src/main/scala/ cat > src/main/scala/SimpleApp.scala << EOF import org.jsoup.Jsoup import scala.jdk.CollectionConverters._ object SimpleApp extends App { val doc = Jsoup.connect("http://www.bbc.com/news").get() val newsHeadlines = doc .select(".gs-c-promo-heading__title") .asScala .map(_.text().trim) .filter(_.nonEmpty) newsHeadlines.foreach(println) } EOF sbt run
For feedback, or to subscribe, go to the Feedback form or the Subscription form.