2012-01-01 31 views
6

Estoy trabajando en un script de Scala que utiliza Joda Time. Hasta hoy, esto estaba funcionando bien. De alguna manera, algo ha cambiado y ya no funciona.¿Por qué puedo usar una lib de Java desde Scala REPL pero no desde un script?

Esto funciona:

$ 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 

pero esto no es así:

$ 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 incluye solamente:

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

import org.joda.time._ 

Period.minutes(5) 

esto también no funciona:

$ 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 

Tampoco es causada por el uso de * en el 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 

... Es tan loco porque este estaba trabajando la última vez que trabajé en este proyecto, sólo un día o dos atrás! Y ahora no está funcionando, y creo que debo haber cambiado algo, pero sinceramente no puedo pensar en qué podría ser.

¡Ayuda!

Respuesta

12

TL; DR: fsc, el "daemon de compilación rápida", tenía un problema con su caché; fsc -shutdown resolvió el problema.

Seth Tisue en the Scala IRC channel on FreeNode fue capaz de ayudarme a resolver mi problema - tuvo algo que ver con fsc el "daemon compilador rápido fuera de línea". Cuando se usa el comando scala para ejecutar un script, usa fsc, y parece que de alguna manera el classpath usado/almacenado en memoria caché por el daemon se dañó.

Resulta que hay algunas maneras de evitar este:

  • pasar el arg -nocompdaemon a scala simplemente no utilizar FSC en todo
    • obras, y debe ser a prueba de fallos, pero lento
  • plazo fsc -shutdown
    • el demonio se reiniciará automáticamente el la próxima vez que utilice scala
  • plazo fsc -reset para restablecer cachés del demonio
    • probablemente sería más rápido que apagarlo, pero la opción menos a prueba de fallos

todavía no saben exactamente lo que causó este problema en primer lugar, pero la impresión que obtuve de Seth y de la página fsc es que este tipo de cosas simplemente sucede a veces.

Gracias, Seth!

+1

La mejor manera de manejarlo no es usar rutas relativas en las directivas de classpath. –

+1

Gracias a DanielC.Sobral, eso tiene sentido, pero esto parece poco práctico para las secuencias de comandos. Mi script tiene esto en la parte superior: '#!/Usr/bin/env scala -cp lib/* -deprecation ! #' Y quiero poder invocar el script desde cualquier ubicación en bash. Entonces quizás haya una mejor manera de hacerlo, pero no es obvio para mí, ya que no soy un experto en bash ni un experto en Scala. –

+0

Utilice el modo de invocación alternativo: llame a sh, y luego, desde sh, llame a scala, en ese punto puede usar pwd para obtener el directorio actual. –

Cuestiones relacionadas