This article will share the following contents.
- Prepare environment
- How to create scala jar
- How to create Fat jar using sbt-assembly plugin
※This article can give you how to use sbt a little bit, but you should learn about sbt from the official documentation if you’d like to learn about it well.
Prepare environment
You need to prepare an environment with sbt and JDK installed.
Docker will allow you to quickly prepare environment.
- Create new directory (
mkdir sbt_test
) andcd
intosbt_test
- Create docker-compose.yml (docker image link)
version: '3'
services:
scala:
image: hseeberger/scala-sbt:8u222_1.3.5_2.13.1
container_name: sbt_test
tty: true
volumes: [".:/work"]
- Execute
docker-compose up -d
command - Enter in docker container with
docker exec -it sbt_test /bin/bash
andcd
into/work
user@linux:~/sbt_test$ docker exec -it sbt_test /bin/bash
root@cd80666fdbe1:~# cd /work
root@cd80666fdbe1:/work#
- Check JDK version with
java -version
root@cd80666fdbe1:/work# java -version
openjdk version "1.8.0_222"
OpenJDK Runtime Environment (build 1.8.0_222-b10)
OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)
You can follow this document (Installing sbt) if you want to use local PC environment.
How to create scala jar
Create the project
- Run the following command. This pulls the ‘hello-world’ template from GitHub.
sbt new scala/hello-world.g8
- When prompted, name the application “hello-world”
A template to demonstrate a minimal Scala application
name [Hello World template]: hello-world
Template applied in /work/./hello-world
cd
intohello-world
Directory tree structure
- hello-world
- project
- build.properties
- src
- main
- scala
- Main.scala
- build.sbt
Prepare files
- src/main/scala/Main.scala (Scala source file)
object Main {
def main(args: Array[String]) {
println("Hello, World!")
}
}
- build.sbt (build definition file for sbt)
name := "hello-world"
organization := "gotoqcode.scala"
version := "1.0"
scalaVersion := "2.11.12"
libraryDependencies += "org.scala-lang.modules" %% "scala-parser-combinators" % "2.1.1"
You can use build.sbt domain-specific language(DSL)
- project/build.properties (settings for sbt)
sbt.version=1.6.2
Run the project
The first time you run sbt, it may take a while to download all the dependencies it needs, but after that first run, it’ll download new dependencies only as needed.
- Run the project
sbt run
Create jar file
- Package the project as a jar file
sbt package
jar file can be created under target/scala-2.11/ directory.
Execute jar file
- Execute with scala interpreter
scala target/scala-2.11/hello-world_2.11-1.0.jar
- Execute with java interpreter
java -cp target/scala-2.11/hello-world_2.11-1.0.jar:$(cat target/streams/compile/dependencyClasspath/_global/streams/export) Main
※ cat target/streams/compile/dependencyClasspath/_global/streams/export
means dependencies.
* /root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.11.12/scala-library-2.11.12.jar
* /root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-parser-combinators_2.11/2.1.1/scala-parser-combinators_2.11-2.1.1.jar
You have to add all dependencies as class path because this jar file(target/scala-2.11/hello-world_2.11-1.0.jar) doesn’t contain any dependencies. You can list its contents with the jar tvf
command. You can check that this jar file has only Manifest file and program(Main class file).
root@cd80666fdbe1:/work/test# jar tvf target/scala-2.11/hello-world_2.11-1.0.jar
285 Fri Jan 01 00:00:00 UTC 2010 META-INF/MANIFEST.MF
661 Fri Jan 01 00:00:00 UTC 2010 Main$.class
668 Fri Jan 01 00:00:00 UTC 2010 Main.class
How to create Fat jar using sbt-assembly plugin
What is Fat jar
A Fat jar also know as a uber jar or jar with dependencies is a jar file that contains not only program, but embeds its dependencies as well.
You can execute Fat jar in the following command, without classpath option.
java -jar <Fat _jar_'s path>
How to use sbt-assembly plugin
You can create a Fat jar using sbt-assembly plugin.
- Prepare project/plugins.sbt to use sbt-assembly plugin
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "1.2.0")
- Run
sbt assembly
command - Execute with java interpreter
java -jar target/scala-2.11/hello-world-assembly-1.0.jar
You can confirm that Fat jar file contains all dependencies using the following command.
jar tvf target/scala-2.11/hello-world-assembly-1.0.jar