web-dev-qa-db-ja.com

Java "定数文字列が長すぎます"コンパイルエラー。Eclipseの使用時ではなく、Antの使用時にのみ発生します

ユーザー情報を初期化するために、1つのクラスにいくつかの本当に長い文字列があります。 Eclipseでコンパイルすると、エラーや警告は表示されず、結果の.jarは問題なく実行されます。

最近、使用するantビルドファイルを作成することにしました。 antで同じクラスをコンパイルするたびに、「定数文字列が長すぎます」コンパイルエラーが発生します。 antでJavaコンパイラ実行可能ファイルを設定するいくつかの方法を試し、Eclipseとまったく同じバージョンを使用していることを確認しました。

私は、AntでEclipseを使用する場合と同じようにコンパイルを成功させる方法を見つけ出し、コードを修正して文字列を動的に連結しようとします。

43
Allan

誰かがあなたにメッセージを送ろうとしている:-)コンパイラのバージョンをいじるのに費やした時間に、テキストファイルからデータをロードできたかもしれません。

チェックアウト:

37
teabot

Apache commons lang StringUtils.join(Object []) メソッドを使用してこれを解決できることがわかりました。

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

上記のどれも私にとってはうまくいきませんでした。 test.txtという名前のテキストファイルを1つ作成し、次のコードを使用してこのテキストファイルを読み取りました

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

クラスファイルの文字列定数の長さは、UTF-8エンコーディングで2 ^ 16バイトに制限されています。これは、使用するコンパイラに依存するものではありません。おそらく、Eclipseとは異なるantファイルの文字セットを使用しているため、一部の文字は以前よりも多くのバイトを必要とします。 encodingタスクのjavac属性を確認してください。

5
Jörn Horstmann

別のトリックは、ソースに長い文字列を挿入することに決めた場合、コンパイラがそれを定数式として検出しないようにすることです。

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

これはしばらくは機能しましたが、行き過ぎた場合、次の問題はコンパイラのスタックオーバーフローです。 これ は同じ問題を説明しており、まだ決定している場合はスタックを増やす方法を示しています。問題はメソッドのサイズの大きさのようです。繰り返しますが、これはEclipseの問題ではありませんでした。

1
df778899

GetResources.getString(R.string.yourstring)を呼び出すよりも、文字列をvalues/strings.xmlに追加します

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

this を試しましたか?自分で試したことはありませんが、関連するセクションは次のとおりです。

Ant javacアダプターの使用Eclipseコンパイラーは、javacアダプターを使用してAntスクリプト内で使用できます。 Eclipseコンパイラを使用するには、スクリプトでbuild.compilerプロパティを定義するだけです。以下に小さな例を示します。

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

クラスの標準に互換性を持たせることを本当に検討します。公式の制限は65535であり、Eclipseがより寛大であるという事実は、最も不便なときに変更される可能性があり、Eclipseでコンパイルされたプロジェクトを常に取得しなければならないことは、実際にあなたを制限し始める可能性があります色々な方法。

0
Yishai