Is there a way to automatically package multiple main classes in the same SBT project with sbt-onejar?

5k views Asked by At

I have an SBT project that contains multiple classes with main, i.e. MyClass extends App. One-jar works fine when there is only one such class. If it finds multiple classes it prompts me to choose which one I want to package:

> one-jar

Multiple main classes detected, select one to run:

 [1] com.smth.AppOne
 [2] com.smth.AppTwo

Enter number: 

I'd like to configure one-jar to automatically package all main classes. In documentation it defines default main class as mainClass in run in Compile, so it looks like it expects only one value.

If this is not possible I'm curious why not. :)

For now I can only think of some hacks like creating a surrogate project for each jar or setting a mainClass in SBT each time before calling one-jar (multiple times per build). These approaches obviously have their deficiencies.

4

There are 4 answers

4
4lex1v On BEST ANSWER

It's not about SBT or onejar plugin. When you pack your project into the jar file, both main classes would be packed. JAR File specification defines that you can have as many classes with main() method as you want, but there should be only one class with main() method defined in Main-Class attribute per JAR

1
1esha On

From documentation:

mainClass in oneJar := Some("com.acme.Woozler")

Try to add

mainClass in oneJar := Some("com.smth.AppOne")

in you configuration

0
Brandon Bradley On

I would try sbt multi-project builds. You should be able to set a main class per project.

0
Mikaël Mayer On

Use the following to set up the default main class:

mainClass in (Compile, run) := Some("com.smth.AppOne")

Source: This stackoverflow Q&A