Scala:Sbt 可以 运行 项目,但调用 jar 会导致 ClassNotFoundError
Scala: Sbt can run project, but calling the jar results in ClassNotFoundError
我有一个将 compile/package/run 使用 SBT 的项目,但是当我使用 Scala 从命令行调用 jar 时,我得到一个 '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
可以,直接调用jar就失败了?
编辑:我使用sbt-assembly解决了这个问题,但是(1)我不认为这是必要的,并且(2)在类似的项目中过去,我使用了完全相同的 build.sbt 和 library/imports/etc,并且从命令行调用时项目可以正常工作。
如果您不想 assemble 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
这里还有很多其他选项:Include jar file in Scala interpreter
您使用的库需要位于 Java 类路径中。如果您不想使用程序集将依赖库包含到 fat jar 中,则需要以其他方式将它们添加到类路径中。例如通过命令行:
java -cp yourApp.jar:somelib.jar:someotherlibjar your.main.Class
java -cp yourApp.jar:libs/* your.main.Class
我有一个将 compile/package/run 使用 SBT 的项目,但是当我使用 Scala 从命令行调用 jar 时,我得到一个 '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
可以,直接调用jar就失败了?
编辑:我使用sbt-assembly解决了这个问题,但是(1)我不认为这是必要的,并且(2)在类似的项目中过去,我使用了完全相同的 build.sbt 和 library/imports/etc,并且从命令行调用时项目可以正常工作。
如果您不想 assemble 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
这里还有很多其他选项:Include jar file in Scala interpreter
您使用的库需要位于 Java 类路径中。如果您不想使用程序集将依赖库包含到 fat jar 中,则需要以其他方式将它们添加到类路径中。例如通过命令行:
java -cp yourApp.jar:somelib.jar:someotherlibjar your.main.Class
java -cp yourApp.jar:libs/* your.main.Class