Компилируется в Eclipse, но не с использованием Javac из командной строки: StackOverFlow - PullRequest
3 голосов
/ 24 июня 2010

У меня есть проект Java, который содержит много очень больших исходных файлов, и он прекрасно компилируется в Eclipse, однако он не будет компилироваться с javac из командной строки или внутри Ant.

Когда я пытаюсь скомпилировать его из команды с помощью 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?

Спасибо, Stef


Это странно, но я обнаружил, что могу скомпилировать код с JDK 1.6.

Это не решает мою проблему, потому что код используется как библиотека другим проектом, и он жалуется и компилирует номера версий, так как JDK 1.5 является стандартом проекта на данный момент (и будет в течение еще нескольких месяцев).

Кто-нибудь знает, что изменилось в 1.6, и возможно ли применить эти изменения к 1.5 с помощью флагов?

Ответы [ 3 ]

3 голосов
/ 24 июня 2010

Когда вы запускаете команду «javac» из командной строки, параметры JVM необходимо указывать с помощью опции «-J».Например;-J-Xms48m устанавливает начальный размер кучи.

Это описано на странице руководства javac (1) .

Если вы получаете StackOverflowError s, опциявы должны настроить размер стека потоков;например, -J-Xss5m.

Это странно, но я обнаружил, что могу скомпилировать код с JDK 1.6.

Я ожидаю, что объяснение является одним изследующее:

  • вы исправляете ошибку javac, исправленную в JDK 1.6 или более позднем выпуске патча JDK 1.5 ,
  • javac в JDK 1.6меньше стеков или
  • размер стека по умолчанию для javac был увеличен.

Одна из возможных ошибок: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6273455

EDIT

... и возможно ли применить эти изменения к 1,5 с помощью флагов?

Предполагая, что вы имеете в виду флаги для включения исправления ошибки компилятора, ответ наиболее вероятенНет. Действительно, если это ошибка выше, то похоже, что обновление до последнего выпуска патча JDK 1.5 тоже не поможет.Однако есть два возможных решения:

  1. В приведенном выше отчете об ошибке представлен возможный обходной путь, который влечет за собой изменение исходного кода, вызывающего ошибку.Но сначала вам нужно будет подтвердить, что это ошибка, которая вызывает проблему, и определить файлы исходного кода.

  2. Возможно, будет возможно скомпилировать ваш рабочий код с помощью SunКомпилятор JDK 1.6 с флагами -source 1.5 -target 1.5.

1 голос
/ 24 июня 2010

Возможно, вам придется предоставить компилятору МНОГО памяти, когда это произойдет (или, может быть, вы ошиблись). Также убедитесь, что javac разветвлен в отдельном процессе, в противном случае эти параметры просто игнорируются.

0 голосов
/ 24 июня 2010

Вы должны быть в состоянии указать Eclipse использовать тот же JDK, который видит ваша командная оболочка.

Я считаю, что Eclipse JDK принадлежит IBM, так что это может объяснить разницу.

...