Emma Pollum
Emma Pollum

Reputation: 85

Specify jar structure in sbt assembly

When sbt-assembly builds a fat jar, it places all the dependencies in the main folder. I need to construct a jar that looks like this

--domain

-- lib

is it possible to do this with sbt assembly, or any other plugin?

Upvotes: 1

Views: 579

Answers (1)

Enes Korukcu
Enes Korukcu

Reputation: 132

If you want to seperate your app jar file and your dependecy jar files, here is the most practical method i found with sbt;

Create project/plugins.sbt file if not exists and add following line:

addSbtPlugin("org.xerial.sbt" % "sbt-pack" % "0.8.0")

After adding this line refresh your project. Note: Plugin version might change in time.

When sbt refresh finishes update your build.sbt file like this:

lazy val MyApp = project.in(file("."))
  .settings(artifactName := {(
      sv: ScalaVersion,
      module: ModuleID,
      artifact: Artifact) => "MyApp.jar" 
  })
  .settings(packSettings)

Then run:

sbt pack

Or if you're doing this for child project, run this:

sbt "project childproject" clean pack

This will nicely seperate your main jar file and your dependency jars.

Your app jar will be in target scala folder.

Your dependencies will be in target/pack/lib.

In this way you can deploy your dependencies once.

And whenever you change your app, you can just deploy your app jar file.

So in every change you don't have to deploy an uber jar file.

Also in production, you can run your app like:

java -cp "MyApp.jar:dependency_jars_folder/*" com.myapp.App

Upvotes: 1

Related Questions