【问题标题】:Why does Scala compile fail on large Java/Scala project in IntelliJ?为什么 Scala 在 IntelliJ 中的大型 Java/Scala 项目上编译失败?
【发布时间】:2010-07-15 13:36:32
【问题描述】:

我有一个 IntelliJ 项目,其中包含 8 个模块和大约 500 条 Java KLines。我在一个依赖于所有其他模块的模块中添加了一个 Scala Facet。

在 IntelliJ IDEA 9.0.2 中编译 HelloWorld.scala 时:

object HelloWorld {
  def main(args: Array[String]) {
    println("Hello World!")
  }
}

我在消息面板中得到以下输出:

Information:Compilation completed with 32 errors and 0 warnings
Information:32 errors
Information:0 warnings
Error:Scalac internal error: class java.lang.reflect.InvocationTargetException [sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method), sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39), sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25), java.lang.reflect.Method.invoke(Method.java:597), org.jetbrains.plugins.scala.compiler.rt.ScalacRunner.main(ScalacRunner.java:74)][scala.tools.nsc.typechecker.Typers$class.newTyper(Typers.scala:68), scala.tools.nsc.Global$analyzer$.newTyper(Global.scala:295), scala.tools.nsc.typechecker.Namers$Namer.<init>(Namers.scala:68), scala.tools.nsc.typechecker.Namers$NormalNamer.<init>(Namers.scala:43), scala.tools.nsc.typechecker.Namers$class.newNamer(Namers.scala:44), scala.tools.nsc.Global$analyzer$.newNamer(Global.scala:295), scala.tools.nsc.typechecker.Namers$Namer$$anonfun$enterSyms$1.apply(Namers.scala:258), scala.tools.nsc.typechecker.Namers$Namer$$anonfun$enterSyms$1.apply(Namers.scala:256), scala.collection.LinearSeqOptimized$class.foreach(LinearSeqOptimized.scala:61), scala.collection.immutable.List.foreach(List.scala:45), scala.tools.nsc.typechecker.Namers$Namer.enterSyms(Namers.scala:256), scala.tools.nsc.typechecker.Namers$Namer.enterSym(Namers.scala:347), scala.tools.nsc.typechecker.Analyzer$namerFactory$$anon$1.apply(Analyzer.scala:39), scala.tools.nsc.Global$GlobalPhase$$anonfun$applyPhase$1.apply(Global.scala:276), scala.tools.nsc.Global$GlobalPhase$$anonfun$applyPhase$1.apply(Global.scala:276), scala.tools.nsc.reporters.Reporter.withSource(Reporter.scala:48), scala.tools.nsc.Global$GlobalPhase.applyPhase(Global.scala:276), scala.tools.nsc.Global$GlobalPhase$$anonfun$run$1.apply(Global.scala:252), scala.tools.nsc.Global$GlobalPhase$$anonfun$run$1.apply(Global.scala:252), scala.collection.Iterator$class.foreach(Iterator.scala:631), scala.collection.mutable.ListBuffer$$anon$1.foreach(ListBuffer.scala:304), scala.tools.nsc.Global$GlobalPhase.run(Global.scala:252), scala.tools.nsc.Global$Run.compileSources(Global.scala:733), scala.tools.nsc.Global$Run.compile(Global.scala:813), scala.tools.nsc.Main$.process(Main.scala:108), scala.tools.nsc.Main$.main(Main.scala:122), scala.tools.nsc.Main.main(Main.scala), sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method), sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39), sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25), java.lang.reflect.Method.invoke(Method.java:597), org.jetbrains.plugins.scala.compiler.rt.ScalacRunner.main(ScalacRunner.java:74)]
Error:sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
Error:sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
Error:sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
Error:java.lang.reflect.Method.invoke(Method.java:597)
Error:org.jetbrains.plugins.scala.compiler.rt.ScalacRunner.main(ScalacRunner.java:74)
Error:Caused by java.lang.OutOfMemoryError: Java heap space
Error:scala.tools.nsc.typechecker.Typers$class.newTyper(Typers.scala:68)
Error:scala.tools.nsc.Global$analyzer$.newTyper(Global.scala:295)
Error:scala.tools.nsc.typechecker.Namers$Namer.<init>(Namers.scala:68)
Error:scala.tools.nsc.typechecker.Namers$NormalNamer.<init>(Namers.scala:43)
Error:scala.tools.nsc.typechecker.Namers$class.newNamer(Namers.scala:44)
Error:scala.tools.nsc.Global$analyzer$.newNamer(Global.scala:295)
Error:scala.tools.nsc.typechecker.Namers$Namer$$anonfun$enterSyms$1.apply(Namers.scala:258)
Error:scala.tools.nsc.typechecker.Namers$Namer$$anonfun$enterSyms$1.apply(Namers.scala:256)
Error:scala.collection.LinearSeqOptimized$class.foreach(LinearSeqOptimized.scala:61)
Error:scala.collection.immutable.List.foreach(List.scala:45)
Error:scala.tools.nsc.typechecker.Namers$Namer.enterSyms(Namers.scala:256)
Error:scala.tools.nsc.typechecker.Namers$Namer.enterSym(Namers.scala:347)
Error:scala.tools.nsc.typechecker.Analyzer$namerFactory$$anon$1.apply(Analyzer.scala:39)
Error:scala.tools.nsc.Global$GlobalPhase$$anonfun$applyPhase$1.apply(Global.scala:276)
Error:scala.tools.nsc.reporters.Reporter.withSource(Reporter.scala:48)
Error:scala.tools.nsc.Global$GlobalPhase.applyPhase(Global.scala:276)
Error:scala.tools.nsc.Global$GlobalPhase$$anonfun$run$1.apply(Global.scala:252)
Error:scala.collection.Iterator$class.foreach(Iterator.scala:631)
Error:scala.collection.mutable.ListBuffer$$anon$1.foreach(ListBuffer.scala:304)
Error:scala.tools.nsc.Global$GlobalPhase.run(Global.scala:252)
Error:scala.tools.nsc.Global$Run.compileSources(Global.scala:733)
Error:scala.tools.nsc.Global$Run.compile(Global.scala:813)
Error:scala.tools.nsc.Main$.process(Main.scala:108)
Error:scala.tools.nsc.Main$.main(Main.scala:122)
Error:scala.tools.nsc.Main.main(Main.scala)

为什么会这样?我可以成功创建一个新的空项目并编译并运行这个 Hello World。

【问题讨论】:

    标签: scala plugins intellij-idea


    【解决方案1】:

    问题是你的内存不足:

    Error:Caused by java.lang.OutOfMemoryError: Java heap space
    

    这可能是因为您的项目规模太大。
    您需要为您的编译器调整 JVM 选项 -Xms-Xmx,以便允许它使用更多内存。

    【讨论】:

      【解决方案2】:

      您是否仔细查看了堆栈跟踪?

      Caused by java.lang.OutOfMemoryError: Java heap space
      

      尝试设置最大值。 JVM 的内存量更高(在命令行上,这是 -Xmx 开关,我不知道如何为 IntelliJ 设置它 - 在文档中查找)。

      【讨论】:

        【解决方案3】:

        这原来是一个内存问题。以下是上下文编译错误的真正原因:

        Error:org.jetbrains.plugins.scala.compiler.rt.ScalacRunner.main(ScalacRunner.java:74)
        ==> Error:Caused by java.lang.OutOfMemoryError: Java heap space <==
        Error:scala.tools.nsc.typechecker.Typers$class.newTyper(Typers.scala:68)
        

        文件 |设置 |编译器 | Scala 编译器 最大堆大小 (MB) 默认设置为 256

        最大堆大小 (MB) 设置为 1024 为我解决了这个问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-08-08
          • 2017-03-22
          • 1970-01-01
          • 2018-09-05
          • 2019-03-25
          • 1970-01-01
          • 2021-11-29
          相关资源
          最近更新 更多