Reputation: 5702
Using scopt https://github.com/scopt/scopt
I have a very simple Scala CLI driver that errors out on the first line of .parse. The line is var i = 0, can’t imagine why that would fail, maybe in how i instantiated the OptionParser?
def parse(args: Seq[String], init: C): Option[C] = {
var i = 0 <———————————————— prints the error below
val pendingOptions = ListBuffer() ++ (nonArgs filterNot {_.hasParent})
Exception in thread "main" java.lang.NoSuchMethodError: scala.runtime.IntRef.create(I)Lscala/runtime/IntRef;
at scopt.OptionParser.parse(options.scala:306)
at org.apache.mahout.drivers.ItemSimilarityDriver$.main(ItemSimilarityDriver.scala:47)
at org.apache.mahout.drivers.ItemSimilarityDriver.main(ItemSimilarityDriver.scala)
Full code here, sorry but I’m new to Scala so this may be a really stupid question
object ItemSimilarityDriver {
/**
* @param args Command line args, if empty a help message is printed.
* @return
*/
def main(args: Array[String]): Unit = {
val parser = new OptionParser[Config]("ItemSimilarity") {
head("ItemSimilarity", "Spark")
opt[Unit]('r', "recursive") action { (_, c) =>
c.copy(recursive = true) } text("The input path should be searched recursively for files that match the filename pattern (optional), Default: false.")
opt[String]('o', "output") required() action { (x, c) =>
c.copy(output = x) } text("Output is a path for all output (required)")
opt[String]('i', "input") required() action { (x, c) =>
c.copy(input = x) } text("Input is a path for input, it may be a filename or dir name. If a directory it will be searched for files matching the -p pattern. (required)")
note("some notes.\n")
help("help") text("prints this usage text")
}
// parser.parse returns Option[C]
parser.parse(args, Config()) map { config => <—————————— parser was created
but this call fails in the parse
// do stuff
//val didIt = true
} getOrElse {
// arguments are bad, error message will have been displayed, throw exception, run away!
}
}
case class Config(recursive: Boolean = false, input: String = null, output: String = null)
}
I've also tried the mutable options method with the same error.
Upvotes: 5
Views: 12713
Reputation: 95654
The problem seems to be mismatch in Scala library version and scopt. The current stable scopt 3.2.0 is cross published against:
Scala 2.10 and 2.11 artifacts uses the sbt 0.12's cross versioning convention and uses _2.10
suffix because Scala 2.10.x minor releases are binary compatible with Scala 2.10.0. In other words scopt_2.11
is NOT a later version of scopt_2.10
. One is compiled against Scala 2.11.x while the other Scala 2.10.x.
I'd recommend you give sbt a try to manage external libraries. sbt has a plugin to generate IntelliJ project for you.
Upvotes: 7