2013-07-01 49 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'重置守护进程所处的任何时髦状态? –

相关问题