bugfix> scala > 投稿

さらに説明した状況に直面しました。私は伝統的な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 件
  • 使用しようとしているライブラリには、互換性のあるScala 2.12 jarが公開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を使用してそのライブラリのソースをコンパイルする必要があります。

あなたの答え