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




(8)

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 à l'aide du code ci-dessous.

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

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.


Avez-vous essayé this ? 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, le fait de devoir constamment compiler le projet avec Eclipse peut vraiment commencer à vous limiter plusieurs façons.


Tu peux essayer ça,

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

La longueur d'une constante de 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. Veuillez vérifier l'attribut de encoding de votre tâche javac .


Une autre astuce, si je suis déterminé à insérer une longue chaîne dans le source, consiste à éviter que le compilateur la 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 pile - le problème semble être la taille même de la méthode. Encore une fois, ce n'était pas un problème dans Eclipse.


Ajoutez votre chaîne à values ​​/ strings.xml puis appelez getResources.getString (R.string.yourstring)



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




ant