2012-01-01 14 views
6

Tôi đang viết kịch bản Scala sử dụng Thời gian Joda. Cho đến ngày hôm nay, điều này đã làm việc tốt. Bằng cách nào đó, một cái gì đó đã thay đổi và nó không còn hoạt động nữa.Tại sao tôi có thể sử dụng một thư viện Java từ Scala REPL nhưng không phải từ một tập lệnh?

này hoạt động:

$ 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 

nhưng điều này không:

$ 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 chỉ chứa:

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

import org.joda.time._ 

Period.minutes(5) 

này cũng không hoạt động:

$ 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 

Nó cũng không gây ra bằng cách sử dụng * trong 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 

... Nó chỉ là quá điên vì điều này đã được làm việc lần cuối cùng tôi làm việc trên dự án này, chỉ cần một hoặc hai ngày trước! Và bây giờ nó không hoạt động, và tôi đoán tôi phải thay đổi một cái gì đó, nhưng thành thật mà nói tôi không thể nghĩ nó là gì.

Trợ giúp!

Trả lời

12

TL; DR: fsc, "daemon biên dịch nhanh", gặp sự cố với bộ nhớ cache; fsc -shutdown đã giải quyết được sự cố.

Seth Tisue trong the Scala IRC channel on FreeNode có thể giúp tôi giải quyết vấn đề của mình - nó có liên quan gì đó với fsc "trình tiện ích trình biên dịch ngoại tuyến nhanh". Khi lệnh scala được sử dụng để chạy tập lệnh, nó sử dụng fsc và có vẻ như đường dẫn lớp được sử dụng/lưu vào bộ nhớ cache của trình tiện ích đã bị rối loạn.

Hóa ra có một số cách để làm việc xung quanh này:

  • vượt qua arg -nocompdaemon để scala chỉ không sử dụng FSC ở tất cả
    • công trình, và cần được failproof, nhưng chậm
  • chạy fsc -shutdown
    • daemon sẽ tự động khởi động lại lần sau khi bạn sử dụng scala
  • chạy fsc -reset để thiết lập lại bộ nhớ đệm của daemon
    • có lẽ sẽ nhanh hơn tắt nó xuống nhưng tùy chọn failproof nhất

tôi vẫn không biết chính xác những gì gây ra vấn đề này xảy ra ở nơi đầu tiên, nhưng ấn tượng tôi nhận được từ Seth và từ trang fsc là loại điều này chỉ xảy ra đôi khi.

Cảm ơn, Seth!

+1

Cách _best_ để xử lý không phải là sử dụng đường dẫn tương đối trong chỉ thị đường dẫn lớp. –

+1

Cảm ơn @ DanielC.Sobral, điều đó có ý nghĩa, nhưng điều này có vẻ không thực tế đối với các tập lệnh. Kịch bản của tôi có điều này ở trên cùng: '#!/Usr/bin/env scala -cp lib/* -deprecation ! #' Và tôi muốn có thể gọi tập lệnh từ bất kỳ vị trí nào trong bash. Vì vậy, có thể có cách tốt hơn để làm điều này nhưng điều đó không rõ ràng đối với tôi, vì tôi không phải là chuyên gia về bash hay chuyên gia về Scala. –

+0

Sử dụng chế độ gọi thay thế - gọi sh, sau đó, từ sh, gọi scala, tại thời điểm đó bạn có thể sử dụng pwd để lấy thư mục hiện tại. –