scalac [scala编译器]为什么不生成所有必需的类文件?

时间:2019-06-19 21:46:07

标签: scala maven compilation sbt

我正在尝试使用名为Please的专有构建工具来构建一个简单的Scala项目。它的作用是有效地在源文件上调用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的选项,这就是我所做的。不过,奇怪的是,当我运行SBT导出文件中报告的完全相同 scalac命令时,它仍然仅生成八个类文件中的五个。

这里有人对Scala编译了解很多吗?是否需要传递一些我丢失的标志到scalac?如果有帮助,我可以发布确切的scalac调用。

1 个答案:

答案 0 :(得分:4)

您正在使用两种不同的Scala版本。

您似乎已设置Maven和sbt以使用Scala 2.11,它会生成额外的匿名类,但是命令行scalac必须是使用JVM lambda的Scala 2.12(如果不是2.13)。 / p>