我有一个包含许多非常大的源文件的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?
答案 0 :(得分:3)
当您从命令行运行“javac”命令时,需要使用“-J”选项指定JVM参数。例如; -J-Xms48m
设置初始堆大小。
javac(1) manual page中记录了这一点。
如果你得到StackOverflowError
s,你应该调整的选项是线程堆栈大小;例如-J-Xss5m
。
这很奇怪,但我发现我可以使用JDK 1.6编译代码。
我希望解释是以下之一:
一个可能的错误是http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6273455
修改强>
...是否可以通过标志将这些更改应用到1.5?
假设您指的是启用编译器错误修复的标志,答案很可能是否。实际上,如果是上面的错误,那么升级到最后一个JDK 1.5修补程序版本似乎也无济于事。但是,有两种可能的解决方案:
上面的错误报告提供了一种可能的解决方法,需要更改触发错误的源代码。但首先,您需要确认这是导致问题的错误,并确定有问题的源代码文件。
可以使用带有标记-source 1.5 -target 1.5
的Sun JDK 1.6编译器编译生产代码。
答案 1 :(得分:1)
当发生这种情况时,您可能必须给编译器提供大量内存(或者您可能遇到了错误,很难说)。还要确保javac在一个单独的进程中是 forked ,否则这些选项就会被忽略。
答案 2 :(得分:0)
您应该能够告诉Eclipse使用命令shell看到的相同JDK。
我相信Eclipse JDK来自IBM,因此可以解释其中的差异。