Опция разбора Scala с помощью scopt

Использование scopt https://github.com/scopt/scopt

У меня есть очень простой драйвер CLI Scala, который выдает ошибки в первой строке.parse. Строка var i = 0, не представляю, почему это не получится, может быть, как я создал экземпляр 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)

Полный код здесь, извините, но я новичок в Scala, так что это может быть действительно глупый вопрос

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)

}

Я также попробовал метод изменяемых опций с той же ошибкой.

1 ответ

Решение

Кажется, проблема в несовпадении версии библиотеки Scala и Scopt. Текущая стабильная версия 3.2.0 опубликована перекрестно с:

  • Scala 2.9.1
  • Scala 2.9.2
  • Scala 2.9.3
  • Scala 2.10
  • Scala 2.11

Артефакты Scala 2.10 и 2.11 используют соглашение о кросс-версиях sbt 0.12 и используют _2.10 суффикс, потому что второстепенные выпуски Scala 2.10.x двоично совместимы с Scala 2.10.0. Другими словами scopt_2.11 НЕ является более поздней версией scopt_2.10, Один скомпилирован с Scala 2.11.x, а другой с Scala 2.10.x.

Я бы порекомендовал вам попробовать sbt для управления внешними библиотеками. У sbt есть плагин для создания проекта IntelliJ для вас.

Другие вопросы по тегам