web-dev-qa-db-fra.com

Erreur de compilation Java "chaîne constante trop longue". Cela ne se produit qu'avec Ant, pas avec Eclipse

J'ai quelques très longues chaînes dans une classe pour initialiser les informations utilisateur. Lorsque je compile dans Eclipse, je ne reçois aucune erreur ni aucun avertissement, et le fichier .jar résultant fonctionne correctement.

Récemment, j'ai décidé de créer un fichier de construction ant à utiliser. Chaque fois que je compile la même classe avec ant, j'obtiens l'erreur de compilation "chaîne constante trop longue". J'ai essayé de nombreuses manières de définir l'exécutable du compilateur Java dans ant pour m'assurer que j'utilise exactement la même version que dans Eclipse.

Je préférerais trouver comment obtenir la même compilation réussie que celle obtenue dans Eclipse dans Ant plutôt que d'essayer de retravailler le code pour concaténer de manière dynamique les chaînes.

38
Allan

Quelqu'un essaie de vous envoyer un message :-) Pendant le temps que vous avez passé à bidouiller les versions du compilateur, vous auriez pu charger les données d'un fichier texte - ce qui est probablement le cas.

Check-out:

34
teabot

J'ai trouvé que je pouvais utiliser la méthode Apache commons lang StringUtils.join (Object []) pour résoudre ce problème.

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

La longueur d'une constante chaîne dans un fichier de classe est limitée à 2 ^ 16 octets en codage UTF-8. Cela ne doit pas dépendre du compilateur utilisé. Vous utilisez peut-être un jeu de caractères différent dans votre fichier Ant que dans Eclipse, de sorte que certains caractères nécessitent davantage d'octets qu'auparavant. Vérifiez l’attribut encoding de votre tâche javac.

5
Jörn Horstmann

Rien de ce qui précède n'a fonctionné pour moi. J'ai créé un fichier texte avec le nom test.txt et lu ce fichier texte avec le code ci-dessous

String content = new String(Files.readAllBytes(Paths.get("test.txt")));
3
Amol Suryawanshi

Une autre astuce, si je suis déterminé à mettre une longue chaîne dans le source, est d'éviter que le compilateur le détecte comme une expression constante.

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

Cela a fonctionné pendant un moment, mais si vous continuez trop loin, le problème suivant est un débordement de pile dans le compilateur. This décrit le même problème et, si vous êtes toujours déterminé, comment augmenter votre stack - le problème semble être la simple taille de la méthode. Encore une fois, ce n'était pas un problème dans Eclipse.

1
df778899

Ajoutez votre chaîne à values ​​/ strings.xml à l'appel getResources.getString (R.string.yourstring)

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

Avez-vous essayé ceci ? Je n'ai jamais essayé moi-même, mais voici la section pertinente:

Utilisation de l'adaptateur ant javac Le compilateur Eclipse peut être utilisé dans un script Ant à l'aide de l'adaptateur javac. Pour utiliser le compilateur Eclipse, il vous suffit de définir la propriété build.compiler dans votre script. Voici un petit exemple.

 <?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>

J'envisagerais vraiment de rendre vos classes compatibles. Je pense que la limite officielle est fixée à 65535, et le fait qu'Eclipse soit plus indulgent pourrait vous changer dans les moments les plus gênants. De toute façon, devoir constamment compiler le projet avec Eclipse peut vraiment vous limiter plusieurs façons.

0
Yishai