2010-06-24 76 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

相關問題