webentwicklung-frage-antwort-db.com.de

Java "Konstante Zeichenfolge zu lang" Kompilierungsfehler. Kommt nur bei Ant vor, nicht bei Eclipse

Ich habe ein paar wirklich lange Zeichenfolgen in einer Klasse zum Initialisieren von Benutzerinformationen. Wenn ich in Eclipse kompiliere, erhalte ich keine Fehler oder Warnungen und die resultierende JAR-Datei läuft einwandfrei.

Vor kurzem habe ich beschlossen, eine Ant-Build-Datei zu erstellen. Immer wenn ich dieselbe Klasse mit ant kompiliere, erhalte ich den Kompilierungsfehler "Konstante Zeichenfolge zu lang". Ich habe verschiedene Möglichkeiten ausprobiert, um die Java-Compiler-Programmdatei in ant festzulegen, um sicherzustellen, dass ich dieselbe Version wie in Eclipse verwende.

Ich möchte lieber herausfinden, wie ich das gleiche erfolgreiche Kompilieren bekomme, das ich in Eclipse in Ant bekomme, als den Code überarbeiten zu lassen, um die Strings dynamisch zu verketten.

38
Allan

Jemand versucht, Ihnen eine Nachricht zu senden :-) In der Zeit, in der Sie mit Compilerversionen herumfummelten, könnten Sie die Daten aus einer Textdatei geladen haben.

Auschecken:

34
teabot

Ich fand, dass ich die Apache commons lang StringUtils.join (Object []) Methode verwenden könnte, um dieses Problem zu lösen.

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

Die Länge einer String-Konstante in einer Klassendatei ist in UTF-8-Codierung auf 2 ^ 16 Byte begrenzt. Dies sollte nicht vom verwendeten Compiler abhängen. Möglicherweise verwenden Sie in Ihrer Ant-Datei einen anderen Zeichensatz als in Eclipse, sodass einige Zeichen mehr Bytes benötigen als zuvor. Bitte überprüfen Sie das encoding-Attribut Ihrer javac-Aufgabe.

5
Jörn Horstmann

Nichts von oben hat für mich funktioniert. Ich habe eine Textdatei mit dem Namen test.txt erstellt und diese Textdatei mit dem folgenden Code gelesen

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

Ein weiterer Trick besteht darin, zu vermeiden, dass der Compiler sie als konstanten Ausdruck erkennt, wenn ich entschlossen bin, eine lange Zeichenfolge in die Quelle einzufügen.

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

Dies funktionierte zwar eine Weile, aber wenn Sie zu weit gehen, ist das nächste Problem ein Stapelüberlauf im Compiler. Dieses beschreibt das gleiche Problem und wenn Sie noch immer wissen, wie Sie Ihren Stack erhöhen, scheint das Problem die schiere Größe der Methode zu sein. Auch dies war kein Problem in Eclipse.

1
df778899

Fügen Sie Ihren String zu values ​​/ strings.xml hinzu.

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

Hast du das versucht? Ich habe es selbst nie probiert, aber hier ist der relevante Abschnitt:

Verwenden des ant-Javac-Adapters Der Eclipse-Compiler kann innerhalb eines Ant-Skripts mit dem Javac-Adapter verwendet werden. Um den Eclipse-Compiler verwenden zu können, müssen Sie lediglich die build.compiler -Eigenschaft in Ihrem Skript definieren. Hier ist ein kleines Beispiel.

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

Ich würde wirklich überlegen, die Standards für Ihre Klassen kompatibel zu machen. Ich glaube, das offizielle Limit liegt bei 65535, und die Tatsache, dass Eclipse nachsichtiger ist, könnte sich zu den unbequemsten Zeiten ändern, und beide Möglichkeiten, das Projekt mit Eclipse ständig zusammenstellen zu müssen, können Sie auch wirklich einschränken viele Möglichkeiten.

0
Yishai