2010-04-29 11 views
31

Tengo algunas cadenas muy largas en una clase para inicializar la información del usuario. Cuando compilo en Eclipse, no recibo ningún error o advertencia, y el .jar resultante funciona bien.Error de compilación Java "cadena constante demasiado larga". Solo sucede con Ant, no cuando uso Eclipse

Recientemente, decidí crear un archivo de compilación ant para usar. Cada vez que compilo la misma clase con hormiga, obtengo el error de compilación "cadena constante demasiado larga". He intentado varias formas de configurar el compilador de Java para que esté seguro de que estoy usando la misma versión que en Eclipse.

Prefiero descubrir cómo obtener la misma compilación exitosa que obtengo en Eclipse en Ant que intentar volver a trabajar el código para concatenar dinámicamente las cadenas.

+2

su cadena es demasiado larga, ya que puede darse cuenta. como un hack puedes dividirlo en múltiples cadenas en tu código fuente y concatenarlas. esto es lo que el compilador de eclipse java está haciendo en su nombre. – Ron

Respuesta

0

¿Usted intentó this? Nunca lo intenté yo mismo, pero aquí está la sección relevante:

Usando el adaptador ant javac El compilador Eclipse se puede utilizar dentro de una secuencia de comandos Ant usando el adaptador javac. Para usar el compilador de Eclipse, simplemente necesita definir la propiedad build.compiler en su secuencia de comandos. Aquí hay un pequeño ejemplo.

<?xml version="1.0" encoding="UTF-8"?> 
<project name="compile" default="main" basedir="../."> 

<property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter"/> 

<property name="root" value="${basedir}/src"/> 

<property name="destdir" value="d:/temp/bin" /> 

<target name="main"> 
    <javac srcdir="${root}" destdir="${destdir}" debug="on" nowarn="on" extdirs="d:/extdirs" source="1.4"> 
     <classpath> 
      <pathelement location="${basedir}/../org.eclipse.jdt.core/bin"/> 
     </classpath> 
    </javac>   
</target> 
</project> 

Realmente consideraría hacer compatibles los estándares de sus clases. Creo que el límite oficial es 65535, y el hecho de que Eclipse sea más indulgente es algo que podría cambiar en el momento más inoportuno, y tener que hacer una compilación constante del proyecto con Eclipse puede comenzar a limitarte demasiado. Muchas maneras.

2

La longitud de una cadena constante en un archivo de clase está limitada a 2^16 bytes en la codificación UTF-8, esto no debería depender del compilador utilizado. Quizás esté utilizando un conjunto de caracteres diferente en su archivo ant que en eclipse, de modo que algunos caracteres necesitan más bytes que antes. Compruebe el atributo encoding de su tarea javac.

22

Me pareció que podía utilizar el método de apache commons lang StringUtils.join(Object[]) para resolver esto.

public static final String CONSTANT = org.apache.commons.lang.StringUtils.join(new String[] { 
    "This string is long", 
    "really long...", 
    "really, really LONG!!!" 
}); 
+1

Me parece una solución realmente ordenada cuando necesito probar algo rápidamente – Miki

+1

Gracias, me salvaste el día :) – Hamid

+0

Me di cuenta de que esta respuesta realmente no responde a la pregunta de los carteles originales, es solo una solución. No lo recomendaría para código de producción, solo para pruebas rápidas y sucias. – mrswadge

0
String theString2 = IOUtils.toString(new FileInputStream(new  
    File(rootDir + "/properties/filename.text")), "UTF-8"); 
+3

Añadir algunos detalles/explicación? –

0

Otro truco, si estoy decidido a poner una cadena larga en la fuente, es evitar el compilador detectar como una expresión constante.

String dummyVar = ""; 
String longString = dummyVar + 
    "This string is long\n" + 
    "really long...\n" + 
    "really, really LONG!!!"; 

Esto funcionó durante un tiempo, pero si se mantiene a ir demasiado lejos el problema siguiente es un desbordamiento de pila en el compilador. This describe el mismo problema y, si aún está determinado, cómo aumentar su pila, el problema parece ser ahora el gran tamaño del método. De nuevo, esto no fue un problema en Eclipse.

0

Agregue su cadena a values ​​/ strings.xml que llame a getResources.getString (R.string.SuCadena)

-1

Puede probar esto,

public static final String CONSTANT = new StringBuilder("Your really long string").toString(); 
Cuestiones relacionadas