Scala: Sbt может запустить проект, но вызов jar приводит к ClassNotFoundError

У меня есть проект, который скомпилирует / упакует / запустит с SBT, но когда я вызываю jar из командной строки с помощью Scala, я получаю "java.lang.ClassNotFoundException".

build.sbt:

name := "coloring"

version := "0.1"

scalaVersion := "2.12.5"

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

Бег sbt run результаты в:

[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

Однако работает scala target/scala-2.12/coloring_2.12-0.1.jar результаты в

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

Что может быть не так? Как это возможно, что sbt run работает, но когда вы вызываете банку напрямую, она выходит из строя?

РЕДАКТИРОВАТЬ: Я решил проблему с помощью sbt-сборки, но (1) я не думаю, что это необходимо, и (2) в аналогичных проектах в прошлом, я использовал точно такой же build.sbt и library/import / и т.д., и проект работает при вызове из командной строки.

2 ответа

Решение

Если вы не хотите собирать uber-jar или что-то подобное, вам нужно иметь зависимости от пути к классам.

Из командной строки это выглядит так:

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

Так что в вашем случае я представляю, что выглядит так:

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

Вы можете сократить -classpath в -cp

Вот еще несколько вариантов: Включить файл jar в интерпретатор Scala

Библиотеки, которые вы используете, должны быть в Java classpath. Если вы не хотите использовать ассемблер для включения зависимых библиотек в толстый файл, вам нужно добавить их в путь к классам другим способом. Например, через командную строку:

java -cp yourApp.jar:somelib.jar:someotherlibjar your.main.Class
java -cp yourApp.jar:libs/* your.main.Class
Другие вопросы по тегам