Embedding JVM in Universal

Sbt Native Packager supports embedding the jvm using the JDKPackager Plugin, however, in some cases you may want instead to embed the JVM/JRE in other formats, e.g. a tarball with one of the java archetypes.

To accomplish this you need to:

  • Add the JVM/JRE of your choice to the mappings
  • Make the launcher use the embedded jre

Adding the JVM

The JRE is by definition OS dependent, hence you must choose the one appropriate for your case. The example below assumes a Linux 64 JRE, whose files are at $HOME/.jre/linux64. The files will be copied to a jre directory in your distribution

import NativePackagerHelper._

...

mappings in Universal ++= {
  val jresDir = Path.userHome / ".jre"
  val linux64Jre = jresDir.toPath.resolve("linux64")
  directory(linux64Jre.toFile).map { j =>
    j._1 -> j._2.replace(jreLink, "jre")
  }
}

Application Configuration

In order to run your application in production you also need to make the launcher use the jre added above. This can be done using the -java-home option with a relative path.

javaOptions in Universal ++= Seq(
  // Your original options

 "-java-home ${app_home}/../jre"
)