2008-10-28 13 views
19

Tengo una prueba de unidad en la que he definido estáticamente una matriz de bytes bastante grande (más de 8000 bytes) como datos de bytes de un archivo que no quiero leer cada vez que ejecuto mi prueba de unidad.javac error "code too large"?

private static final byte[] FILE_DATA = new byte[] { 
12,-2,123,................ 
} 

Este compila bien dentro de Eclipse, pero al compilar a través de script Ant me sale el siguiente error:

[javac] C:\workspace\CCUnitTest\src\UnitTest.java:72: code too large 
[javac]  private static final byte[] FILE_DATA = new byte[] { 
[javac]        ^

Cualquier idea por qué y cómo puedo evitar esto?


respuesta: La respuesta de Shimi hizo el truco. Moví el conjunto de bytes a una clase separada y compiló bien. ¡Gracias!

+0

Entonces, ¿por qué funcionó en Eclipse? – paxdiablo

+1

Sé que Eclipse está usando un compilador diferente que Javac. Quizás eso lo explique. –

+0

Ah, sí lo olvidé. Instalé Eclipse antes del JDK una sola vez para encontrarlo compilado, fue entonces cuando descubrí que tenía su propio compilador incorporado. – paxdiablo

Respuesta

22

Los métodos en Java están restringidos a 64k en el código de bytes. Las inicializaciones estáticas se realizan en un único método (consulte link)
Puede intentar cargar los datos de la matriz desde un archivo.

0

Puede cargar la matriz de bytes desde un archivo en su @BeforeClass método estático. Esto se asegurará de que se cargue solo una vez para todas las pruebas de su unidad.

0

Puede aprovechar las clases internas ya que cada una tendrá su propio límite de 64 KB. Puede que no le ayude con una sola matriz grande ya que la clase interna estará sujeta al mismo límite de inicializador estático que su clase principal. Sin embargo, indicó que logró resolver el problema moviendo su matriz a una clase separada, por lo que sospecho que está cargando más que solo esta matriz en su clase principal.

En lugar de:

private static final byte[] FILE_DATA = new byte[] {12,-2,123,...,<LARGE>}; 

Probar:

private static final class FILE_DATA 
{ 
    private static final byte[] VALUES = new byte[] {12,-2,123,...,<LARGE>}; 
} 

A continuación, se puede acceder a los valores como FILE_DATA.VALUES[i] en lugar de FILE_DATA[i], pero usted es sujeto a un límite de 128 KB en lugar de sólo 64 KB.