在Eclipse中编译但不在命令行中使用Javac编译:StackOverFlow

时间:2010-06-24 09:06:51

标签: java eclipse ant stack-overflow javac

我有一个包含许多非常大的源文件的Java项目,它在Eclipse中编译得很好,但它不能从命令行或Ant中使用javac进行编译。

当我尝试使用javac(或使用Ant)从命令编译它时,我得到一个StackOverflow异常:

   [javac] java.lang.StackOverflowError
   [javac]  at com.sun.tools.javac.jvm.Gen.genCond(Gen.java:786)
   [javac]  at com.sun.tools.javac.jvm.Gen.genCond(Gen.java:739)
   [javac]  at com.sun.tools.javac.jvm.Gen.visitBinary(Gen.java:1841)
   [javac]  at com.sun.tools.javac.tree.Tree$Binary.accept(Tree.java:926)
   [javac]  at com.sun.tools.javac.jvm.Gen.genExpr(Gen.java:806)
   [javac]  at com.sun.tools.javac.jvm.Gen.genCond(Gen.java:786)
   ...
   ...
   ...

我已经尝试在命令行和Ant javac任务中向JVM传递了许多参数,例如-Xss,-Xmx,-Xoss等,但我总是得到同样的错误。

根据我的阅读,Eclipse IDE似乎有一个与Sun JDK不同的编译器。有没有办法让JDK以类似于Eclipse的方式编译?

谢谢, 燕姿


这很奇怪,但我发现我可以使用JDK 1.6编译代码。

这不能解决我的问题,因为代码被另一个项目用作lib而且它抱怨和编译版本号,因为JDK 1.5目前是项目标准(并将持续几个月)。

有谁知道1.6中的变化,是否可以通过标志将这些变化应用于1.5?

3 个答案:

答案 0 :(得分:3)

当您从命令行运行“javac”命令时,需要使用“-J”选项指定JVM参数。例如; -J-Xms48m设置初始堆大小。

javac(1) manual page中记录了这一点。

如果你得到StackOverflowError s,你应该调整的选项是线程堆栈大小;例如-J-Xss5m

  

这很奇怪,但我发现我可以使用JDK 1.6编译代码。

我希望解释是以下之一:

  • 您正在查找已在JDK 1.6 或更高版本的JDK 1.5中修复的javac错误
  • JDK 1.6中的
  • javac不那么堆栈,或者
  • javac的默认堆栈大小已增加。

一个可能的错误是http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6273455

修改

  

...是否可以通过标志将这些更改应用到1.5?

假设您指的是启用编译器错误修复的标志,答案很可能是否。实际上,如果是上面的错误,那么升级到最后一个JDK 1.5修补程序版本似乎也无济于事。但是,有两种可能的解决方案:

  1. 上面的错误报告提供了一种可能的解决方法,需要更改触发错误的源代码。但首先,您需要确认这是导致问题的错误,并确定有问题的源代码文件。

  2. 可以使用带有标记-source 1.5 -target 1.5的Sun JDK 1.6编译器编译生产代码。

答案 1 :(得分:1)

当发生这种情况时,您可能必须给编译器提供大量内存(或者您可能遇到了错误,很难说)。还要确保javac在一个单独的进程中是 forked ,否则这些选项就会被忽略。

答案 2 :(得分:0)

您应该能够告诉Eclipse使用命令shell看到的相同JDK。

我相信Eclipse JDK来自IBM,因此可以解释其中的差异。