【问题标题】:Why isn't scalac [scala compiler] generating all of the necessary class files?为什么 scalac [scala 编译器] 不生成所有必要的类文件?
【发布时间】:2019-11-02 16:53:55
【问题描述】:

我正在尝试使用名为 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都会生成以下8个类文件:

  • 配置类
  • 配置$.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时,它只生成了以下五个类:

  • 配置类
  • 配置$.class
  • Main$$anon$1.class
  • Main.class
  • Main$.class

当然,由于缺少类文件,我在尝试调用生成的 JAR 文件时会立即遇到运行时错误。但我不确定 SBT 或 Maven 在编译该代码时有何不同。即使有-verbose 标志,Maven 仍然是一个黑盒子——我对它可能调用的子进程没有任何了解。另一方面,SBT 确实可以选择运行export compile,这就是我所做的。但奇怪的是,当我运行 SBT 导出文件中报告的 完全相同 scalac 命令时,它仍然只构建了八个类文件中的五个。

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

【问题讨论】:

    标签: scala maven compilation sbt


    【解决方案1】:

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

    您似乎已将 Maven 和 sbt 设置为使用生成额外匿名类的 Scala 2.11,但命令行 scalac 必须是使用 JVM lambdas 的 Scala 2.12(如果不是 2.13)。

    【讨论】:

    • 有趣。当我在我的系统上搜索所有名为scalac 的二进制文件并使用/path/to/scalac -version 调用它们时,它们中的每一个都会打印出2.12.8。那么 SBT/Maven 使用的是什么?我在我的系统上没有看到 2.11 版本的 scalac。是否有一些隐藏标志可以传递给 scalac 以在“旧版本”模式或类似模式下编译?
    • 在 sbt 中有 scalaVersion 键,您可以使用它来设置项目的版本。所以,在build.sbt 中添加scalaVersion := "2.12.8"
    猜你喜欢
    • 2015-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    • 2014-03-16
    • 1970-01-01
    • 1970-01-01
    • 2011-11-30
    相关资源
    最近更新 更多