This is an excerpt from the 1st Edition of the Scala Cookbook (partially modified for the internet). This is Recipe 6.4, “How to launch a Scala application with an object
.”
Problem
You want to start a Scala application with a main method, or provide the entry point for a script.
Solution
There are two ways to create a launching point for your application:
- define an
object
that extends theApp
trait - define an object with a properly defined
main
method
(1) Extend App
For the first solution, define an object
that extends the App
trait. Using this approach, the following code creates a simple but complete Scala application:
object Hello extends App { println("Hello, world") }
The code in the body of the object is automatically run, just as if it were inside a main
method.
Just save that code to a file named Hello.scala, compile it with scalac
, and then run it with scala
, like this:
$ scalac Hello.scala $ scala Hello Hello, world
When using this approach, any command-line arguments to your application are implicitly available through an args
object, which is inherited from the App
trait. The args
object is an instance of Array[String]
, just as if you had declared a main
method yourself. The following code demonstrates how to use the args
object:
object Hello extends App { if (args.length == 1) println(s"Hello, ${args(0)}") else println("I didn't get your name.") }
After it’s been compiled, this program yields the following results:
$ scala Hello I didn't get your name. $ scala Hello Joe Hello, Joe
(2) Create a main method inside an object
The second approach to launching an application is to manually implement a main
method with the correct signature in an object, in a manner similar to Java:
object Hello2 { def main(args: Array[String]) { println("Hello, world") } }
This is also a simple but complete application.
Discussion
Note that in both cases, Scala applications are launched from an object, not a class. I tend to use the App trait for both scripts and larger applications, but you can use either approach. I recommend reviewing the source code for the App
trait to better understand what it performs. The source code is available from the URL in the See Also section.
The Scaladoc for the App
trait currently includes two caveats:
- It should be noted that this trait is implemented using the
DelayedInit
functionality, which means that fields of the object will not have been initialized before themain
method has been executed. - It should also be noted that the
main
method will not normally need to be overridden: the purpose is to turn the whole class body into the “main method.” You should only choose to override it if you know what you are doing.
See the Scaladoc for the App
and DelayedInit
traits for more information.
this post is sponsored by my books: | |||
#1 New Release |
FP Best Seller |
Learn Scala 3 |
Learn FP Fast |
See Also
- The Scala App trait
- The Scala DelayedInit trait
- The shell script examples in Chapter 14 demonstrate more examples of the
App
trait.