2017-12-31 41 views
0

私はこの問題を避けるためにsbtを使うことができますが、知識のためだけです。なぜ私はコードをコンパイルできるのか分かりませんが、それを実行することはできません。スカラーのコンパイルは成功しましたが、それを実行していません

私のディレクトリ構造のようなある:

$ ls io_monad/* 
io_monad/Test.scala 

io_monad/classes: 
io_monad 

io_monad/lib: 
cats-core_2.12-0.9.0.jar cats-effect_2.12-0.7.jar 

シンプルTest.scala成功

$ scalac -cp "io_monad/lib/cats-core_2.12-0.9.0.jar:io_monad/lib/cats-effect_2.12-0.7.jar" -d io_monad/classes io_monad/Test.scala 

でもないアプリ

$ scala -cp "io_monad/lib/cats-core_2.12-0.9.0.jar:io_monad/lib/cats-effect_2.12-0.7.jar:io_monad/classes/" io_monad.Test 
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8 
java.lang.ClassNotFoundException: cats.kernel.Semigroup 
の実行をコンパイル

package io_monad 

import cats.effect.IO 

object Test extends App { 

    val program:IO[Unit] = for { 
     _   <- IO { println("First name?") } 
     firstName <- IO { scala.io.StdIn.readLine } 
     _   <- IO { println(s"Last name?") } 
     lastName <- IO { scala.io.StdIn.readLine } 
     _   <- IO { println(s"First: $firstName, Last: $lastName") } 
    } yield() 

    program.unsafeRunSync() 
} 

を提出

答えて

4

コンパイル時にコードはクラスパス上の2つのjarのクラスファイルのみに依存しますが、実行時にcats-coreまたはcats-effectのコードにはcats-kernelのクラスも必要です。 cats-kernelに依存するコードはすでにバイトコードにコンパイルされているため、コンパイル時には問題ありません。

+0

私はこれを正しく理解しているかどうかを知ることができますか? コンパイル時に 'cat-effect'だけが必要であることがわかりました。実行時に 'cats-coreとcats-kernel'も必要です。 コンパイル中に、 'cats-effect'、' cats-kernel'、 'cats-core'のjarファイルがクラスパスにあると仮定します。したがって、 'cats-effect'は正常にコンパイルされ、jarファイルが作成されます。したがって、ランタイム中に2つのjarファイルがクラスパスに存在する必要があります。 – laiboonh

+0

私はそれが正しいと思う、はい。 –

関連する問題