Logister
Logister

Reputation: 1894

Scala: Sbt can run project, but calling the jar results in ClassNotFoundError

I have a project that will compile/package/run with SBT, but when I call the jar from the command line with Scala, I get a 'java.lang.ClassNotFoundException'.

build.sbt:

name := "coloring"

version := "0.1"

scalaVersion := "2.12.5"

libraryDependencies ++= Seq("org.scala-graph" %% "graph-core" % "1.12.5")

running sbt run results in:

[info] Compiling 1 Scala source to /path/to/dir/coloring/target/scala-2.12/classes ...
[warn] there was one feature warning; re-run with -feature for details
[warn] one warning found
[info] Done compiling.
[info] Packaging /path/to/dir/coloring/target/scala-2.12/coloring_2.12-0.1.jar ...
[info] Done packaging.
[info] Running Main 
[success] Total time: 6 s, completed May 21, 2018 12:55:19 PM

However running scala target/scala-2.12/coloring_2.12-0.1.jar results in

java.lang.ClassNotFoundException: scalax.collection.GraphBase$InnerNode

What could be going wrong here? How is it possible that sbt run works, but when you call the jar directly, it fails?

EDIT: I solved the problem using sbt-assembly, but (1) I don't think this should be necessary, and (2) in similar projects in the past, I have used the exact same build.sbt and library/imports/etc and the project works when called from the command line.

Upvotes: 3

Views: 1206

Answers (2)

Metropolis
Metropolis

Reputation: 2128

If you don't want to assemble an uber-jar or similar, you'll need to have the dependencies on the classpath.

From the command line, that looks like:

scala -classpath my_1st.jar:my_2nd.jar:my_3rd.jar <whatever command>

So in your case, I imagine that looks like:

scala -classpath path/to/scala-graph.jar target/scala-2.12/coloring_2.12-0.1.jar

You can shorten -classpath to -cp

Here are quite a few other options: Include jar file in Scala interpreter

Upvotes: 1

Pietrotull
Pietrotull

Reputation: 497

Libraries that you use need to be in the Java classpath. If you don't want to use assembly to include dependent libraries into a fat jar, you need to add them to the classpath some other way. For example via command line:

java -cp yourApp.jar:somelib.jar:someotherlibjar your.main.Class
java -cp yourApp.jar:libs/* your.main.Class

Upvotes: 1

Related Questions