Вот что я нашел.
После публикации моего вопроса я продолжил и изменил задачу компиляции с атрибутами fork="true"
, memoryinitialsize="256m"
и memorymaximumsize="1024m"
(сегодня выяснилось, что это было предложено Kieron и jmanning2k, спасибо за ваше время). Тем не менее, это не решило проблему.
Я решил начать удалять классы из дерева исходных текстов, чтобы посмотреть, может ли проблема определить проблему. Оказывается, у нас был класс клиента веб-службы для Axis 1.4 , который был автоматически сгенерирован из файла WSDL. Теперь этот класс является монстром (как во Франкенштейне), он имеет 167 членов поля (все из них имеют тип String), 167 пар получатель / установщик (1 для каждого поля), конструктор, который получает все 167 полей в качестве параметров, метод equals, который сравнивает все 167 полей странным образом. Для каждого поля сравнение выглядит так:
(this.A == null && other.getA() == null) || (this.A != null && this.A.equals(other.getA()))
Результат этого сравнения "anded" (&&) с результатом сравнения следующего поля и т. Д. Класс продолжает метод hashCode, который также использует все поля, некоторые пользовательские методы сериализации XML и метод, который возвращает объект метаданных, специфичный для Axis, который описывает класс и который также использует все члены поля.
Этот класс никогда не изменяется, поэтому я просто помещаю скомпилированную версию в путь к классам приложения, и проект компилируется без проблем.
Теперь я знаю, что удаление этого единственного исходного файла решило проблему. Однако я абсолютно не знаю, почему именно этот класс вызвал проблему. Будет приятно узнать; что может вызвать или вызывает StackOverflowError во время компиляции кода Java? Я думаю, я отправлю этот вопрос.
Для заинтересованных:
- Windows XP SP2
- JDK СОЛНЦА 1.4.2_17
- Муравей 1.7.0