Scala SBT не может использовать стороннюю библиотеку - PullRequest
0 голосов
/ 25 мая 2018

Я столкнулся с ситуацией, описанной далее.У меня есть проект SBT с традиционной структурой каталога , в котором я хотел бы использовать эту библиотеку .Проблема возникает, когда я пытаюсь разобрать строку непосредственно в программе.

import io.github.facaiy.math.expression.MathExp

object SampleApp extends App {

    val str = "1 + 5 / 2"
    val ex  = MathExp.parse(str)
    val output = ex.eval(Map[String, Double]())

    println(output)
}

Я получаю сообщение об ошибке

sbt:StackOvTest> run
[info] Packaging /home/kost/Prog/MyDev/Scala/StackOvTest/target/scala-2.12/stackovtest_2.12-0.1.0.jar ...
[info] Done packaging.
[info] Running SampleApp 
[error] (run-main-1) java.lang.NoClassDefFoundError: scala/util/parsing/combinator/JavaTokenParsers
[error] java.lang.NoClassDefFoundError: scala/util/parsing/combinator/JavaTokenParsers
[error]     at java.lang.ClassLoader.defineClass1(Native Method)
[error]     at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
[error]     at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
[error]     at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
[error]     at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
[error]     at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
[error]     at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
[error]     at java.security.AccessController.doPrivileged(Native Method)
[error]     at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
[error]     at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
[error]     at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
[error]     at io.github.facaiy.math.expression.compiler.MathExpCompiler$.apply(MathExpCompiler.scala:13)
[error]     at io.github.facaiy.math.expression.MathExp$.parse(MathExp.scala:14)
[error]     at SampleApp$.delayedEndpoint$SampleApp$1(SampleApp.scala:6)
[error]     at SampleApp$delayedInit$body.apply(SampleApp.scala:3)
[error]     at scala.Function0.apply$mcV$sp(Function0.scala:34)
[error]     at scala.Function0.apply$mcV$sp$(Function0.scala:34)
[error]     at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)
[error]     at scala.App.$anonfun$main$1$adapted(App.scala:76)
[error]     at scala.collection.immutable.List.foreach(List.scala:389)
[error]     at scala.App.main(App.scala:76)
[error]     at scala.App.main$(App.scala:74)
[error]     at SampleApp$.main(SampleApp.scala:3)
[error]     at SampleApp.main(SampleApp.scala)
[error]     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[error]     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[error]     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[error]     at java.lang.reflect.Method.invoke(Method.java:498)
[error]     at sbt.Run.invokeMain(Run.scala:93)
[error]     at sbt.Run.run0(Run.scala:87)
[error]     at sbt.Run.execute$1(Run.scala:65)
[error]     at sbt.Run.$anonfun$run$4(Run.scala:77)
[error]     at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
[error]     at sbt.util.InterfaceUtil$$anon$1.get(InterfaceUtil.scala:10)
[error]     at sbt.TrapExit$App.run(TrapExit.scala:252)
[error]     at java.lang.Thread.run(Thread.java:748)
[error] Caused by: java.lang.ClassNotFoundException: scala.util.parsing.combinator.JavaTokenParsers
[error]     at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
[error]     at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
[error]     at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
[error]     at java.lang.ClassLoader.defineClass1(Native Method)
[error]     at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
[error]     at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
[error]     at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
[error]     at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
[error]     at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
[error]     at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
[error]     at java.security.AccessController.doPrivileged(Native Method)
[error]     at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
[error]     at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
[error]     at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
[error]     at io.github.facaiy.math.expression.compiler.MathExpCompiler$.apply(MathExpCompiler.scala:13)
[error]     at io.github.facaiy.math.expression.MathExp$.parse(MathExp.scala:14)
[error]     at SampleApp$.delayedEndpoint$SampleApp$1(SampleApp.scala:6)
[error]     at SampleApp$delayedInit$body.apply(SampleApp.scala:3)
[error]     at scala.Function0.apply$mcV$sp(Function0.scala:34)
[error]     at scala.Function0.apply$mcV$sp$(Function0.scala:34)
[error]     at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)
[error]     at scala.App.$anonfun$main$1$adapted(App.scala:76)
[error]     at scala.collection.immutable.List.foreach(List.scala:389)
[error]     at scala.App.main(App.scala:76)
[error]     at scala.App.main$(App.scala:74)
[error]     at SampleApp$.main(SampleApp.scala:3)
[error]     at SampleApp.main(SampleApp.scala)
[error]     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[error]     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[error]     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[error]     at java.lang.reflect.Method.invoke(Method.java:498)
[error]     at sbt.Run.invokeMain(Run.scala:93)
[error]     at sbt.Run.run0(Run.scala:87)
[error]     at sbt.Run.execute$1(Run.scala:65)
[error]     at sbt.Run.$anonfun$run$4(Run.scala:77)
[error]     at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
[error]     at sbt.util.InterfaceUtil$$anon$1.get(InterfaceUtil.scala:10)
[error]     at sbt.TrapExit$App.run(TrapExit.scala:252)
[error]     at java.lang.Thread.run(Thread.java:748)
[error] java.lang.RuntimeException: Nonzero exit code: 1
[error]     at sbt.Run$.executeTrapExit(Run.scala:124)
[error]     at sbt.Run.run(Run.scala:77)
[error]     at sbt.Defaults$.$anonfun$bgRunTask$5(Defaults.scala:1168)
[error]     at sbt.Defaults$.$anonfun$bgRunTask$5$adapted(Defaults.scala:1163)
[error]     at sbt.internal.BackgroundThreadPool.$anonfun$run$1(DefaultBackgroundJobService.scala:366)
[error]     at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
[error]     at scala.util.Try$.apply(Try.scala:209)
[error]     at sbt.internal.BackgroundThreadPool$BackgroundRunnable.run(DefaultBackgroundJobService.scala:289)
[error]     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
[error]     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
[error]     at java.lang.Thread.run(Thread.java:748)
[error] (Compile / run) Nonzero exit code: 1
[error] Total time: 1 s, completed May 25, 2018 6:13:01 PM

в случае настройки библиотеки через build.sbt,который выглядит следующим образом:

name := "StackOvTest"

version := "0.1.0"

scalaVersion := "2.12.3"

libraryDependencies += "io.github.facaiy" % "math-expression-parser" % "0.0.1"

Также я попытался загрузить соответствующий jar-файл, содержащий эту библиотеку, и поместить этот архив в каталог StackOvTest / lib, но я все еще получаю ту же ошибку.Я заметил несколько сообщений, касающихся комбинаторов парсера scala.Даже после добавления

libraryDependencies += "org.scala-lang.modules" %% "scala-parser-combinators" % "1.0.7"

ничто не заставляет его работать.Что я делаю не так?

1 Ответ

0 голосов
/ 25 мая 2018

Похоже, библиотека, которую вы пытаетесь использовать, не имеет совместимого jar Scala 2.12, доступного в общедоступном репозитории maven, см. здесь .

Это означает, что SBT импортирует версиюта библиотека, которая ожидает использования Scala 2.11, поэтому она не работает при поиске классов, которые там существуют и не существуют в 2.12.

Обычно вы используете символ %% SBT для получения «правильной» версиибиблиотеки (которая использует версию Scala, используемую в вашей сборке):

"io.github.facaiy" %% "math-expression-parser" % "0.0.1"

И действительно, в этом случае, если вы используете это в проекте Scala 2.12, вы увидите, что SBT не можетнайдите подходящую версию:

[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  ::          UNRESOLVED DEPENDENCIES         ::
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  :: io.github.facaiy#math-expression-parser_2.12;0.0.1: not found
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::

У вас нет простых решений, либо используйте Scala 2.11 в своем проекте, либо вам придется попробовать самостоятельно скомпилировать исходные коды этой библиотеки, используя Scala 2.12.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...