2012-01-01 4 views
6

私はJoda Timeを使用する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引数で*を使用することによって引き起こされていない:

$ 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 Tisue in the Scala IRC channel on FreeNode私は自分の問題を解決するのを手伝ってくれました。それはfscの「高速オフラインコンパイラデーモン」と何か関係がありました。 scalaコマンドを使ってスクリプトを実行すると、fscが使用され、何とかそのデーモンによって使用/キャッシュされたクラスパスが乱れているように見えます。

これは、この問題を回避するには、いくつかの方法がありますが判明:

  • ちょうどすべて
    • 作品でFSCを使用しないように-nocompdaemonscalaに引数を渡すと、failproofする必要がありますが、しかし遅い
  • 実行fsc -shutdownデーモンが自動的に再起動されます
    • あなたは、私はまだ知らないscala
    • はおそらくそれをシャットダウンするよりも高速になり、デーモンのキャッシュをリセットするには、実行fsc -resetが、少なくともfailproofオプション

を使用し、次回この問題が最初に発生した原因はまさに私がSethとfscページから得た印象であり、時にはこの種のことが時々起こるということです。

ありがとう、セス!それを処理する

+1

_best_方法は、クラスパスのディレクティブで相対パスを使用しないことです。 –

+1

Thanks @ DanielC.Sobral、それは理にかなっていますが、これはスクリプトでは実用的ではないようです。私のスクリプトはこれを一番上に置いています: '#!/ usr/bin/env scala -cp lib/* -deprecation !#'そして、bashの任意の場所からスクリプトを呼び出せます。だから、これを行う良い方法があるかもしれませんが、私はバッシュの専門家でもなくScalaの専門家でもないので、私には分かりません。 –

+0

代替呼び出しモードを使用してください。shを呼び出し、次にshからscalaを呼び出します。この時点で、pwdを使用して現在のディレクトリを取得できます。 –

関連する問題