Erreur de compilation “Java chaîne trop longue”. Se produit uniquement avec Ant, pas avec Eclipse

J’ai quelques chaînes très longues dans une classe pour initialiser les informations utilisateur. Lorsque je comstack dans Eclipse, je ne reçois aucune erreur ou avertissement, et le fichier .jar obtenu fonctionne correctement.

Récemment, j’ai décidé de créer un fichier de génération de fourmi à utiliser. Chaque fois que je comstack la même classe avec ant, j’obtiens l’erreur de compilation “chaîne constante trop longue”. J’ai essayé un certain nombre de façons 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 dans Eclipse dans Ant que d’essayer de retravailler le code pour concaténer dynamicment les chaînes.

Quelqu’un essaie de vous envoyer un message 🙂 Pendant le temps que vous avez passé à manipuler les versions du compilateur, vous auriez pu charger les données à partir d’un fichier texte – ce qui est probablement le cas.

Check-out:

  • java.util.Propriétés
  • Apache Commons FileUtils.readFileToSsortingng ()

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

public static final Ssortingng CONSTANT = org.apache.commons.lang.SsortingngUtils.join( new Ssortingng[] { "This ssortingng is long", "really long...", "really, really LONG!!!" } ); 

La longueur d’une constante de chaîne dans un fichier de classe est limitée à 2 ^ 16 octets dans le codage UTF-8, cela ne devrait pas dépendre du compilateur utilisé. Vous utilisez peut-être un jeu de caractères différent dans votre fichier ant plutôt que dans éclipse, de sorte que certains caractères nécessitent plus d’octets qu’auparavant. Veuillez vérifier l’atsortingbut de encoding de votre tâche javac .

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

 Ssortingng dummyVar = ""; Ssortingng longSsortingng = dummyVar + "This ssortingng is long\n" + "really long...\n" + "really, really LONG!!!"; 

Cela a fonctionné pendant un moment, mais si vous continuez à aller trop loin, le problème suivant est un débordement de stack dans le compilateur. Cela décrit le même problème et, si vous êtes toujours déterminé, comment augmenter votre stack – 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.

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.comstackr dans votre script. Voici un petit exemple.

               

Je voudrais vraiment envisager de rendre vos classes compatibles avec les normes. Je crois que la limite officielle est 65535, et le fait qu’Eclipse soit plus indulgent est quelque chose qui pourrait changer à votre convenance, et que le fait de devoir constamment comstackr le projet avec Eclipse peut vraiment commencer à vous limiter. plusieurs façons.

  Ssortingng theSsortingng2 = IOUtils.toSsortingng(new FileInputStream(new File(rootDir + "/properties/filename.text")), "UTF-8"); 

Ajoutez votre chaîne à des valeurs / ssortingngs.xml plutôt que d’appeler getResources.getSsortingng (R.ssortingng.yourssortingng)

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

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

Vous pouvez essayer ceci,

 public static final Ssortingng CONSTANT = new SsortingngBuilder("Your really long ssortingng").toSsortingng();