代码之家  ›  专栏  ›  技术社区  ›  Alain O'Dea

为什么Scala编译在大型的Java/Scala项目中失败?

  •  1
  • Alain O'Dea  · 技术社区  · 14 年前

    我有一个具有八个模块和大约500行Java的英特利工程。我将scala方面添加到依赖于所有其他模块的模块中。

    编译时 地狱世界斯卡拉 在Intellij IDEA 9.0.2中:

    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世界。

    3 回复  |  直到 14 年前
        1
  •  3
  •   Philipp    14 年前

    问题是内存不足:

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

    这可能是因为你的项目规模。
    您需要调整JVM选项 XMS XMX 对于您的编译器,这样它就可以使用更多的内存。

        2
  •  3
  •   Jesper    14 年前

    您仔细查看了堆栈跟踪吗?

    Caused by java.lang.OutOfMemoryError: Java heap space
    

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

        3
  •  3
  •   Alain O'Dea    14 年前

    结果这是一个记忆问题。以下是上下文编译错误的真正原因:

    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) 设置为 二百五十六 默认情况下。

    设置 最大堆大小(MB) 一千零二十四 帮我解决了这个问题。