2012-01-01 90 views
6

我正在使用Joda时间的Scala脚本。直到今天,这工作正常。不知何故,某些东西已经改变,并且不再有效。为什么我可以使用Scala REPL中的Java lib而不是脚本?

这工作:

$ scala -cp "lib/*" 
Welcome to Scala version 2.9.1.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_29). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> import org.joda.time._ 
import org.joda.time._ 

scala> Period.minutes(5) 
res0: org.joda.time.Period = PT5M 

但这并不:

$ scala -cp "lib/*" test.scala 
/Users/avi/Dev/experiments/rollups/scala/test.scala:4: error: object joda is not a member of package org 
import org.joda.time._ 
     ^
one error found 

test.scala只包含:

#!/usr/bin/env scala -cp lib/* -deprecation 
!# 

import org.joda.time._ 

Period.minutes(5) 

这也不起作用:

$ scala -cp "lib/*" -e "import org.joda.time._" 
/var/folders/c4/gh5y9_cx5bz8x_4wm060l_mm0000gn/T/scalacmd1248995773392653303.scala:1: error: object joda is not a member of package org 
import org.joda.time._ 
     ^
one error found 

它也不会造成在cp ARG使用*

$ scala -cp lib/joda-time-2.0.jar:lib/joda-convert-1.2.jar -e "import org.joda.time._" 
/var/folders/c4/gh5y9_cx5bz8x_4wm060l_mm0000gn/T/scalacmd5438658792813459030.scala:1: error: object joda is not a member of package org 
import org.joda.time._ 
     ^
one error found 

...这只是太疯狂了,因为这是工作我最后一次在这个项目上的工作,只需一两小时前!现在它不工作了,我想我必须改变一些东西,但老实说,我想不出它会是什么。

帮助!

回答

12

TL; DR:fsc,“快速编译守护进程”,它的缓存存在问题; fsc -shutdown解决了这个问题。

Seth Tisuethe Scala IRC channel on FreeNode能够帮我解决我的问题 - 它必须与fsc“快下线的编译器守护”的东西做的。当使用scala命令运行脚本时,它使用fsc,看起来守护进程使用/缓存的类路径出现了问题。

原来有几种方法来解决此问题:

  • 通过ARG -nocompdaemonscala只是不是在所有
    • 作品使用FSC,并应failproof,但速度缓慢
  • 运行fsc -shutdown
    • 守护程序会自动重新启动下次使用scala
  • 运行fsc -reset重置守护进程的高速缓存
    • 很可能比其关闭速度更快,但至少failproof选项

我仍然不知道究竟是什么原因导致了这个问题的发生,但是我从Seth和fsc页面得到的印象是这种事情有时会发生。

谢谢,Seth!

+1

处理它的_best_方法不是在classpath指令中使用相对路径。 – 2012-01-01 14:01:03

+1

感谢@ DanielC.Sobral,这很有道理,但这对于脚本来说似乎不切实际。我的脚本在顶部有:#!/ usr/bin/env scala -cp lib/* -deprecation !#'我希望能够从bash中的任何位置调用脚本。所以也许有更好的方法来做到这一点,但对我来说并不明显,因为我不是一个bash专家,也不是一个Scala专家。 – 2012-01-01 15:42:04

+0

使用替代调用模式 - 调用sh,然后从sh调用scala,此时可以使用pwd来获取当前目录。 – 2012-01-02 12:34:06

相关问题