This guide demonstrates how to create a Scala application with Gradle using gradle init
. You can follow the guide step-by-step to create a new project from scratch or download the complete sample project using the links above.
Gradle comes with a built-in task, called init
, that initializes a new Gradle project in an empty folder. The init
task uses the (also built-in) wrapper
task to create a Gradle wrapper script, gradlew
.
The first step is to create a folder for the new project and change directory into it.
Run the init taskFrom inside the new project directory, run the init
task using the following command in a terminal: gradle init
. When prompted, select the 1: application
project type and 4: Scala
as the implementation language. Next you can choose the DSL for writing buildscripts - 1 : Kotlin
or 2: Groovy
. For the other questions, press enter to use the default values.
The output will look like this:
$ gradle init Select type of build to generate: 1: Application 2: Library 3: Gradle plugin 4: Basic (build structure only) Enter selection (default: Application) [1..4] 1 Select implementation language: 1: Java 2: Kotlin 3: Groovy 4: Scala 5: C++ 6: Swift Enter selection (default: Java) [1..6] 4 Enter target Java version (min: 7, default: 21): Project name (default: demo): Select application structure: 1: Single application project 2: Application and library project Enter selection (default: Single application project) [1..2] 1 Select build script DSL: 1: Kotlin 2: Groovy Enter selection (default: Kotlin) [1..2] Generate build using new APIs and behavior (some features may change in the next minor release)? (default: no) [yes, no] BUILD SUCCESSFUL 1 actionable task: 1 executed
The init
task generates the new project with the following structure:
âââ gradle (1)
â âââ libs.versions.toml (2)
â âââ wrapper
â âââ gradle-wrapper.jar
â âââ gradle-wrapper.properties
âââ gradlew (3)
âââ gradlew.bat (3)
âââ settings.gradle.kts (4)
âââ app
âââ build.gradle.kts (5)
âââ src
âââ main
â âââ scala (6)
â âââ demo
â âââ App.scala
âââ test
âââ scala (7)
âââ demo
âââ AppSuite.scala
âââ gradle (1)
â âââ libs.versions.toml (2)
â âââ wrapper
â âââ gradle-wrapper.jar
â âââ gradle-wrapper.properties
âââ gradlew (3)
âââ gradlew.bat (3)
âââ settings.gradle (4)
âââ app
âââ build.gradle (5)
âââ src
âââ main
â âââ scala (6)
â âââ demo
â âââ App.scala
âââ test
âââ scala (7)
âââ demo
âââ AppSuite.scala
1 Generated folder for wrapper files 2 Generated version catalog 3 Gradle wrapper start scripts 4 Settings file to define build name and subprojects 5 Build script of app
project 6 Default Scala source folder 7 Default Scala test source folder
You now have the project setup to build a Scala application.
Review the project filesThe settings.gradle(.kts)
file has two interesting lines:
settings.gradle.kts
rootProject.name = "demo"
include("app")
settings.gradle
rootProject.name = 'demo'
include('app')
rootProject.name
assigns a name to the build, which overrides the default behavior of naming the build after the directory it’s in. It’s recommended to set a fixed name as the folder might change if the project is shared - e.g. as root of a Git repository.
include("app")
defines that the build consists of one subproject called app
that contains the actual code and build logic. More subprojects can be added by additional include(…)
statements.
Our build contains one subproject called app
that represents the Scala application we are building. It is configured in the app/build.gradle(.kts)
file:
app/build.gradle.kts
plugins {
scala (1)
application (2)
}
repositories {
mavenCentral() (3)
}
dependencies {
implementation(libs.scala.library) (4)
implementation(libs.guava) (5)
testImplementation(libs.junit) (6)
testImplementation(libs.scalatest.v2.v13)
testImplementation(libs.junit.v4.v13.v2.v13)
testRuntimeOnly(libs.scala.xml.v2.v13) (7)
}
application {
mainClass = "demo.App" (8)
}
app/build.gradle
plugins {
id 'scala' (1)
id 'application' (2)
}
repositories {
mavenCentral() (3)
}
dependencies {
implementation libs.scala.library (4)
implementation libs.guava (5)
testImplementation libs.junit (6)
testImplementation libs.scalatest.v2.v13
testImplementation libs.junit.v4.v13.v2.v13
testRuntimeOnly libs.scala.xml.v2.v13 (7)
}
application {
mainClass = 'demo.App' (8)
}
1 Apply the scala Plugin to add support for Scala. 2 Apply the application plugin to add support for building a CLI application in Java. 3 Use Maven Central for resolving dependencies. 4 Use Scala 2.13 in our library project 5 This dependency is used by the application. 6 Use Scalatest for testing our library 7 Need scala-xml at test runtime 8 Define the main class for the application.
The file src/main/scala/demo/App.scala
is shown here:
Generated src/main/scala/demo/App.scala
/*
* This source file was generated by the Gradle 'init' task
*/
package demo
object App {
def main(args: Array[String]): Unit = {
println(greeting())
}
def greeting(): String = "Hello, world!"
}
The generated test, src/test/scala/demo/App.scala
is shown next:
Generated src/test/scala/demo/AppSuite.scala
/*
* This source file was generated by the Gradle 'init' task
*/
package demo
import org.scalatest.funsuite.AnyFunSuite
import org.junit.runner.RunWith
import org.scalatestplus.junit.JUnitRunner
@RunWith(classOf[JUnitRunner])
class AppSuite extends AnyFunSuite {
test("App has a greeting") {
assert(App.greeting() != null)
}
}
The generated test class has a single ScalaTest test. The test instantiates the App
class, invokes a method on it, and checks that it returns the expected value.
Thanks to the application
plugin, you can run the application directly from the command line. The run
task tells Gradle to execute the main
method in the class assigned to the mainClass
property.
$ ./gradlew run > Task :app:run Hello world! BUILD SUCCESSFUL 2 actionable tasks: 2 executedThe first time you run the wrapper script,
gradlew
, there may be a delay while that version of gradle
is downloaded and stored locally in your ~/.gradle/wrapper/dists
folder. Bundle the application
The application
plugin also bundles the application, with all its dependencies, for you. The archive will also contain a script to start the application with a single command.
$ ./gradlew build BUILD SUCCESSFUL in 0s 7 actionable tasks: 7 executed
If you run a full build as shown above, Gradle will have produced the archive in two formats for you: app/build/distributions/app.tar
and app/build/distributions/app.zip
.
The best way to learn more about what your build is doing behind the scenes, is to publish a build scan. To do so, just run Gradle with the --scan
flag.
$ ./gradlew build --scan BUILD SUCCESSFUL in 0s 7 actionable tasks: 7 executed Publishing a build scan to scans.gradle.com requires accepting the Gradle Terms of Service defined at https://gradle.com/terms-of-service. Do you accept these terms? [yes, no] yes Gradle Terms of Service accepted. Publishing build scan... https://gradle.com/s/5u4w3gxeurtd2
Click the link and explore which tasks where executed, which dependencies where downloaded and many more details!
SummaryThat’s it! You’ve now successfully configured and built a Scala application project with Gradle. You’ve learned how to:
Initialize a project that produces a Scala application
Run the build and view the test report
Execute a Scala application using the run
task from the application
plugin
Bundle the application in an archive
To learn more about how you can further customize Scala application projects, check out the following user manual chapters:
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4