2017-12-31 51 views
0

저는이 문제를 피하기 위해 sbt를 사용할 수 있지만 지식을 위해서만 사용할 수 있습니다. 내가 왜 코드를 컴파일 할 수 있지만 그것을 실행할 수 있는지 모르겠습니다.scala를 성공적으로 컴파일했지만 실행하지 않습니다.

내 디렉토리 구조는 다음과 같은 수 있습니다 :

$ 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이

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 

하지만 실행을 컴파일 파일

$ 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 

답변

4

컴파일시에 코드는 classpath에있는 2 개의 jar 파일의 클래스 파일에만 의존하지만 런타임에 cats-core 또는 cats-effect의 코드는 cats-kernel의 클래스가 필요합니다. cats-kernel에 의존하는 코드가 이미 바이트 코드로 컴파일 되었기 때문에 컴파일하는 동안 문제가되지 않습니다.

+0

정확하게 이해했는지 확인할 수 있습니까? 컴파일하는 동안'cat-effect' 만 필요하다는 것을 알게되었습니다. 런타임 중에'cats-core와 cats-kernel'도 필요합니다. 컴파일 중'cats-effect','cats-kernel','cats-core' jar 파일이 classpath에 있다고 가정합니다. 그러므로'cats-effect'는 성공적으로 컴파일되고 jar가 생성 될 수 있습니다. 따라서 런타임 중에이 2 개의 jar 파일이 클래스 경로에 있어야합니다. – laiboonh

+0

나는 그것이 옳다고 생각한다. –