Почему scalac [компилятор scala] не генерирует все необходимые файлы классов? - PullRequest
1 голос
/ 20 июня 2019

Я пытаюсь получить простой проект Scala для сборки с использованием проприетарного инструмента сборки под названием Please .То, что он делает, фактически вызывает scalac в моих исходных файлах для создания соответствующих файлов, а затем упаковывает их вместе.К сожалению, я обнаружил, что в нем отсутствуют некоторые необходимые файлы классов, поэтому я начал экспериментировать, непосредственно вызвав scalac.

У меня правильно строится проект с Maven и SBT.Вот код для моего основного класса:

package com.mypackage

case class Config(input: String = null)

object Main {

  val parser = new scopt.OptionParser[Config]("testapp") {
    arg[String]("input") action { (x, c) => c.copy(input = x) } text("input value")
  }

  def main(args: Array[String]) {
    parser.parse(args, Config()) map { config =>
      val input = config.input
      println("input value is " + input)
    } getOrElse {
        System.exit(1)
    }
  }
}

Я заметил, что в папке src/main/scala/com/myproject и Maven, и SBT сгенерируют следующие восемь файлов классов:

  • Config.class
  • Config $ .class
  • Main $$ anon $ 1 $$ anonfun $ 1.class
  • Main $$ anon $ 1.class
  • Main $$ anonfun $ main $ 1.class
  • Main $$ anonfun $ main $ 2.class
  • Main.class
  • Main $ .class

Но когда я вызываю scalac напрямую, он генерирует только следующие пять классов:

  • Config.class
  • Config $ .class
  • Main $$ anon $ 1.class
  • Main.class
  • Main $ .class

Конечно, с отсутствующими файлами классов, я сразу же сталкиваюсь с ошибками во время выполнения при попытке вызвать результирующийФайл JAR.Но я не уверен, что SBT или Maven делают по-разному для компиляции этого кода.Даже с флагом -verbose Maven все еще остается черным ящиком - я не понимаю, какие подпроцессы он может вызывать.С другой стороны, у SBT есть опция для запуска export compile, и это то, что я сделал.Странно, однако, что когда я запускаю точно такую ​​же команду *1049* scalac, о которой сообщается в файле экспорта SBT, он все равно создает только пять из восьми файлов классов.

Кто-нибудь здесь знает многоо компиляции Scala?Есть ли какие-то флаги, которые мне нужно передать scalac, которые я пропускаю?Я могу опубликовать точный scalac вызов, который я использую, если это будет полезно.

1 Ответ

4 голосов
/ 20 июня 2019

Вы используете две разные версии Scala.

Похоже, у вас настроены Maven и sbt для использования Scala 2.11, которая генерирует дополнительные анонимные классы, но командная строка scalac должна бытьScala 2.12 (если не 2.13), в которой вместо этого используются лямбда-выражения JVM.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...