2010-06-24 75 views
3

我有一个Java项目,它包含许多非常大的源文件,并且它在Eclipse中编译良好,但它不会在命令行或Ant中使用javac进行编译。在Eclipse中进行编译,但不能在命令行中使用Javac进行编译:StackOverFlow

当我尝试从命令用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) 
    ... 
    ... 
    ... 

我试图通过一些参数传递给JVM如-Xss, - Xmx,-Xoss等都在命令行和Ant javac任务中,但我总是得到相同的错误。

从我读过的看来,Eclipse IDE有一个与Sun JDK不同的编译器。有没有办法让JDK以类似于Eclipse的方式编译?

感谢, 燕姿


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

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

有谁知道1.6中有什么变化,是否可以通过标志将这些更改应用到1.5?

+0

你可以使用eclipse编译器从ant(Google for it)。 – 2010-06-24 09:08:59

+0

我没有想到这一点,谢谢! 链接这里:http://help.eclipse.org/ganymede/index.jsp?topic=/org.eclipse.jdt.doc.isv/guide/jdt_api_compile.htm – Stefg 2010-06-24 13:15:08

回答

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吗?

假设你的意思的标志,以使编译器的bug修复,答案很可能是第事实上,如果它上面的错误,那么它看起来像升级到最后的JDK 1.5补丁发布将没有帮助。然而,有两种可能的解决方案:

  1. 的错误报告以上给出了一个可能的解决方法在于需要改变被触发错误的源代码。但首先您需要确认这是导致问题的错误,并确定有问题的源代码文件。

  2. 使用Sun JDK 1.6编译器和-source 1.5 -target 1.5标志编译生产代码是可能的。

+0

感谢那个Stephen,我一直在使用-J选项,所以我想这可能是一个在1.6中修复的bug。 – Stefg 2010-06-24 10:07:22

1

当发生这种情况时(或者您可能碰到一个错误,很难说),您可能不得不给予编译器很大的内存空间。也可以确定javac是在单独的进程中分叉了,否则这些选项将被忽略。

+0

我曾尝试给它最大的内存量我可以和它仍然发生,所以我不知道日食可以给它更多的记忆。 我已经设置了forked =“true”,所以这些选项正在被使用,当我打印详细的输出时,我可以看到从蚂蚁应用到javac的参数 – Stefg 2010-06-24 09:51:42

0

您应该能够告诉Eclipse使用与您的命令行程序所看到的JDK相同的JDK。

我相信Eclipse JDK是来自IBM,所以可以解释这种差异。

+0

这就是我的想法,但似乎Eclipse使用它自己的编译器,即使当我设置JDK,除非我做错了,当然:) – Stefg 2010-06-24 09:49:41

+0

@Stefg:没错。 Eclipse仅使用JDK加载要编译的类。它总是使用它自己的编译器。 – 2010-06-25 08:46:41

+0

不喜欢Eclipse的另一个原因。 – duffymo 2010-06-25 11:09:00