У меня есть модульный тест, в котором я статически определил довольно большой байтовый массив (более 8000 байтов) как байтовые данные файла, который я не хочу читать каждый раз, когда я запускаю свой модульный тест.
private static final byte[] FILE_DATA = new byte[] {
12,-2,123,................
}
Это нормально компилируется в Eclipse, но при компиляции с помощью скрипта Ant я получаю следующую ошибку:
[javac] C:\workspace\CCUnitTest\src\UnitTest.java:72: code too large
[javac] private static final byte[] FILE_DATA = new byte[] {
[javac] ^
Есть идеи, почему и как я могу этого избежать?
Отвечать: Ответ Шими сработал. Я переместил массив байтов в отдельный класс, и он отлично скомпилировался. Спасибо!
Я знаю, что Eclipse использует другой компилятор, чем Javac. Может быть, это объяснит это.
Ах да, я забыл об этом. Я установил Eclipse до JDK один раз только для того, чтобы найти его скомпилированным - именно тогда я узнал, что у него есть встроенный компилятор.
Я просто решил эту проблему, разделив инициализацию моих данных на 120 различных статических методов.
@paxdiablo Eclipse использует ECJ
Где документально подтверждено, что Eclipse использует другой компилятор? Это не имеет смысла, если в свойстве Java Compiler для проекта используется стандартный компилятор.




Методы в Java ограничены 64 КБ в байтовом коде. Статические инициализации выполняются одним методом (см. связь)
Вы можете попробовать загрузить данные массива из файла.
Вы можете загрузить массив байтов из файла в статический метод @BeforeClass. Это гарантирует, что он будет загружен только один раз для всех ваших модульных тестов.
Вы можете использовать внутренние классы, поскольку у каждого из них будет собственный лимит в 64 КБ. Это может не помочь вам с одним большим массивом, поскольку внутренний класс будет подвергаться тому же статическому ограничению инициализатора, что и ваш основной класс. Однако вы заявили, что вам удалось решить проблему, переместив массив в отдельный класс, поэтому я подозреваю, что вы загружаете в основной класс не только этот единственный массив.
Вместо:
private static final byte[] FILE_DATA = new byte[] {12,-2,123,...,<LARGE>};
Пытаться:
private static final class FILE_DATA
{
private static final byte[] VALUES = new byte[] {12,-2,123,...,<LARGE>};
}
Затем вы можете получить доступ к значениям как FILE_DATA.VALUES[i] вместо FILE_DATA[i], но вы ограничены 128 КБ вместо 64 КБ.
Так почему это сработало в Eclipse ??