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.
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:
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!!!"
} );
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
.
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")));
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.
Ajoutez votre chaîne à values / strings.xml à l'appel getResources.getString (R.string.yourstring)
String theString2 = IOUtils.toString(new FileInputStream(new
File(rootDir + "/properties/filename.text")), "UTF-8");
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.