Noel Yap
Noel Yap

Reputation: 19798

Why does Scala script fail if CLASSPATH is set?

I have the following Scala 2.10 script that works fine:

#!/bin/bash

classpath="${CLASSPATH}"
unset CLASSPATH

exec ${SCALA_HOME}/bin/scala -cp "${classpath}" "$0" "$@" 2>&1
!#

import stuff

But when CLASSPATH isn't unset, it fails with stuff like:

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

one error found

Why is this happening?

Upvotes: 0

Views: 631

Answers (2)

som-snytt
som-snytt

Reputation: 39577

The scala script has a modest -debug option.

Use -Ylog-classpath to see what the compiler is using.

Use -nc to say "no compile server daemon".

Use fsc -shutdown to start over.

Package changes are anathema, so unexpected dirs in the path with package names, or old package objects, etc, cause inexplicable build problems.

Use PathResolver to dump what classpath it sees.

An empty directory with your package name can interfere with package discovery.

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

You'll see something like:

apm@mara:~/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'

Upvotes: 3

Noel Yap
Noel Yap

Reputation: 19798

There may be some funky state leftover from the compiler daemon. Try fsc -shutdown or scala -nc to reset the daemon.

Upvotes: 2

Related Questions