2013-07-01 56 views
0

我有以下斯卡拉2.10腳本工作正常:如果設置了CLASSPATH,爲什麼Scala腳本會失敗?

#!/bin/bash 

classpath="${CLASSPATH}" 
unset CLASSPATH 

exec ${SCALA_HOME}/bin/scala -cp "${classpath}" "$0" "[email protected]" 2>&1 
!# 

import stuff 

但當CLASSPATHunset,它失敗之類的東東:

$ ./setter-for-catan.scala 
./setter-for-catan.scala:12: error: not found: object play 
import play.api.libs.json.JsArray 
    ^

one error found 

這究竟是爲什麼?

回答

2

有可能是從編譯器守護一些時髦的狀態剩。嘗試使用fsc -shutdownscala -nc來重置守護進程。

+0

什麼?我回答了你的問題,你沒有給予綠色檢查?儘管我發現scala工具本質上很有趣,但這種情況對我說:「我不需要你的幫助。」 –

+0

@ som-snytt,PathResolver沒有解決問題。複製我在這裏發佈的答案,我會刪除我的並檢查你的(如果系統仍然允許我這樣做)。你還會注意到,我檢查了你的評論,導致我的答案,我特別要求你創建自己的答案。我等待着你的回答,但從未見過一個(相反,你評論說'爲你感到高興'),所以我創造了我自己的。我很感謝您的幫助,並很樂意爲您提供信用。 –

+0

@ som-snytt,順便說一句,我試着在我的評論中給你貼上標籤,但是如果它直接面向答案所有者,它似乎會消滅標籤。 –

2

scala腳本有一個適度的-debug選項。

使用-Ylog-classpath來查看編譯器正在使用什麼。使用來說「沒有編譯服務器守護進程」。

使用fsc -shutdown重新開始。

軟件包的變化是令人厭惡的,因此包名稱或舊包對象等路徑中的意外目錄導致無法解釋的構建問題。使用PathResolver來轉儲它看到的類路徑。

包名稱的空目錄可能會影響包發現。

${SCALA_HOME}/bin/scala -cp "${classpath}" scala.tools.util.PathResolver 
${SCALA_HOME}/bin/scala -cp "${classpath}" scala.tools.util.PathResolver some-args 

你會看到類似這樣的:

[email protected]:~/tmp/scripts$ ./foo.sh 
object Environment { 
    scalaHome   = /media/Software/scala-2.10.1 (useJavaClassPath = true) 
    javaBootClassPath = <1122 chars> 
    javaExtDirs  = 
/usr/lib/jvm/java-7-openjdk-amd64/jre/lib/ext 
/usr/java/packages/lib/ext 
    javaUserClassPath = "" 
    scalaExtDirs  = 
} 
object Defaults { 
    scalaHome   = /media/Software/scala-2.10.1 
    javaBootClassPath = 
/usr/lib/jvm/java-7-openjdk-amd64/jre/lib/resources.jar 
/usr/lib/jvm/java-7-openjdk-amd64/jre/lib/rt.jar 
/usr/lib/jvm/java-7-openjdk-amd64/jre/lib/sunrsasign.jar 
/usr/lib/jvm/java-7-openjdk-amd64/jre/lib/jsse.jar 
/usr/lib/jvm/java-7-openjdk-amd64/jre/lib/jce.jar 
/usr/lib/jvm/java-7-openjdk-amd64/jre/lib/charsets.jar 
/usr/lib/jvm/java-7-openjdk-amd64/jre/lib/netx.jar 
/usr/lib/jvm/java-7-openjdk-amd64/jre/lib/plugin.jar 
/usr/lib/jvm/java-7-openjdk-amd64/jre/lib/rhino.jar 
/usr/lib/jvm/java-7-openjdk-amd64/jre/lib/jfr.jar 
/usr/lib/jvm/java-7-openjdk-amd64/jre/classes 
/media/Software/scala-2.10.1/lib/akka-actors.jar 
/media/Software/scala-2.10.1/lib/jline.jar 
/media/Software/scala-2.10.1/lib/scala-actors.jar 
/media/Software/scala-2.10.1/lib/scala-actors-migration.jar 
/media/Software/scala-2.10.1/lib/scala-compiler.jar 
/media/Software/scala-2.10.1/lib/scala-library.jar 
/media/Software/scala-2.10.1/lib/scala-partest.jar 
/media/Software/scala-2.10.1/lib/scalap.jar 
/media/Software/scala-2.10.1/lib/scala-reflect.jar 
/media/Software/scala-2.10.1/lib/scala-swing.jar 
/media/Software/scala-2.10.1/lib/typesafe-config.jar 
    scalaLibDirFound  = Some(/media/Software/scala-2.10.1/lib) 
    scalaLibFound  = /media/Software/scala-2.10.1/lib/scala-library.jar 
    scalaBootClassPath = 
    scalaPluginPath  = /media/Software/scala-2.10.1/misc/scala-devel/plugins 
} 
COMMAND: 'scala some-args' 
RESIDUAL: 'scala some-args' 
+0

我在未設置的CLASSPATH之前和之後添加了對PathResolver-debug的調用。兩者絕對沒有區別。 –

+1

@NoelYap另請嘗試scala -nc -Ylog-classpath,其中-nc忽略外部編譯器;或者fsc -shutdown。也許你只是處理編譯狀態,因爲它表示「對象播放」(不是價值播放)。 –

+0

'-nc'工作。然後我刪除它,腳本仍然工作。也許'-nc'重置守護進程所處的任何時髦狀態? –

相關問題