How to set the Main class to run using sbt-assembly plugin for SBT multi-projects

2.6k Views Asked by At

Here's my project structure on the filesystem:

rootProj
  +- masterProj
  +- proj1
  ...
  +- projN

I'm trying to use sbt-assembly plugin to create a fat jar. I want to set the main class as

masterProj/core/Main.scala

in order to get a runnable fat jar when assemble from rootProj directory executing the assemby command

How can I set mainClass in rootProj/build.sbt ?

I set

mainClass in assembly := Some("core.Main") // fully qualified path

but when I try to run the jar after assembling

rootProj$ java -jar target/scala-2.10/rootProj-assembly-0.1-SNAPSHOT.jar

I get this error

Exception in thread "main" java.lang.NoClassDefFoundError: core/Main
Caused by: java.lang.ClassNotFoundException: core.Main
  at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
  at java.security.AccessController.doPrivileged(Native Method)
  at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
  at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
  at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
  at java.lang.ClassLoader.loadClass(ClassLoader.java:247)

Any hint?

Here's my build.sbt

import AssemblyKeys._

assemblySettings

name := "deals-backend"

version := Common.version

scalaVersion := Common.scalaVersion

resolvers ++= Seq(
  "Sonatype OSS Snapshots" at "https://oss.sonatype.org/content/repositories/snapshots",
  "Sonatype repository"    at "https://oss.sonatype.org/service/local/staging/deploy/maven2"
)

scalacOptions in ThisBuild ++= Seq("-unchecked", "-deprecation", "-feature")

retrieveManaged := true

lazy val dealsClassifier   = Project( "deals-classifier", file("deals-classifier") )

lazy val dealsEntities     = Project( "deals-entities-pub", file("deals-entities-pub") )

lazy val dealsDbPre        = Project( "deals-db-pre", file("deals-db-pre") )

lazy val dealsDbPub        = Project( "deals-db-pub", file("deals-db-pub") )

lazy val dealsSolrClient   = Project( "deals-solr-client", file("deals-solr-client") ).dependsOn(dealsDbPub % "test->test;compile->compile")

lazy val dealsMasterSpray  = Project( "deals-master-spray", file("deals-master-spray") )
           .dependsOn(dealsClassifier, dealsEntities, dealsDbPre, dealsDbPub, dealsSolrClient)
           .settings(mainClass in (Compile, run) := Some("core.Main"))

lazy val root = project.in( file(".") ).aggregate(dealsClassifier, dealsEntities, dealsDbPre, dealsDbPub, dealsSolrClient, dealsMasterSpray)

run in Compile <<= (run in Compile in dealsMasterSpray)

mainClass in (Compile, assembly) := Some("deals-master-spray.core.Main")
0

There are 0 best solutions below