我知道我可以使用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
Simple Test.scala文件
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()
}
编译成功
$ 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
但不是app的运行
$ 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
答案 0 :(得分:4)
在编译时,您的代码仅依赖于类路径上的这2个jar中的类文件,但在运行时,cats-core
或cats-effect
中的代码也需要cats-kernel
中的类。这在编译期间不是问题,因为依赖于cats-kernel
的代码已经编译为字节码。