Scala script FAQ: How do I set the CLASSPATH in a Scala shell script?
If you need to set the CLASSPATH when executing a Scala script, use the exec command as shown in the following example:
#!/bin/sh exec scala -classpath "lib/htmlcleaner-2.2.jar:lib/scalaemail_2.9.1-1.0.jar:lib/stockutils_2.9.1-1.0.jar" "$0" "$@" !#
As you can see from that code, I'm adding three jar files to my classpath at the beginning of my Scala shell script.
If you’re having a problem where this isn’t working, it may be necessary to include the current directory as the “.” character at the beginning of that classpath, like this:
#!/bin/sh exec scala -classpath ".:lib/htmlcleaner-2.2.jar:lib/commons-lang3-3.1.jar" -savecompiled "$0" "$@" !#
Source code for a complete example
For the sake of completeness, here's the source code for a Scala script I wrote last night named GetStocks.sh:
#!/bin/sh
exec scala -classpath "lib/htmlcleaner-2.2.jar:lib/scalaemail_2.9.1-1.0.jar:lib/stockutils_2.9.1-1.0.jar" "$0" "$@"
!#
import java.io._
import scala.io.Source
import com.devdaily.stocks.StockUtils
import scala.collection.mutable.ArrayBuffer
object GetStocks {
case class Stock(symbol: String, name: String, price: BigDecimal)
val DIR = System.getProperty("user.dir")
val SLASH = System.getProperty("file.separator")
val CANON_STOCKS_FILE = DIR + SLASH + "stocks.dat"
val CANON_OUTPUT_FILE = DIR + SLASH + "quotes.out"
def main(args: Array[String]) {
// read the stocks file into a list of strings ("AAPL|Apple")
val lines = Source.fromFile(CANON_STOCKS_FILE).getLines.toList
// create a list of Stock from the symbol, name, and by retrieving the price
var stocks = new ArrayBuffer[(Stock)]()
lines.foreach{ line =>
val fields = line.split("\\|")
val symbol = fields(0)
val html = StockUtils.getHtmlFromUrl(symbol)
val price = StockUtils.extractPriceFromHtml(html, symbol)
val stock = Stock(symbol, fields(1), BigDecimal(price))
stocks += stock
}
// build a string we can output
var sb = new StringBuilder
stocks.foreach { stock =>
sb.append("%s is %s\n".format(stock.name, stock.price))
}
val output = sb.toString
// write the string to the file
val pw = new PrintWriter(new File(CANON_OUTPUT_FILE))
pw.write(output)
pw.close
}
}
GetStocks.main(args)
As the GetStocks.sh name indicates, I run that code as a normal Linux shell script. I make it executable with chmod +x, then run it.
That code needs some cleanup, but if you want to modify the CLASSPATH when running a Scala shell script, I hope the example is helpful.
Note: I've read elsewhere that you can use a wildcard like "lib/*.jar" when setting the classpath, but I haven't been able to get that to work, at least not on a Mac OS X (Unix) system.
As a final note, see the scala command man page for more information.

