2012-01-01 68 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

相關問題