Java“常量字符串太长”编译错误。只有使用Ant才会发生,而不是在使用Eclipse时

时间:2010-04-29 15:26:11

标签: java eclipse ant

我在一个类中有一些非常长的字符串用于初始化用户信息。当我在Eclipse中编译时,我没有收到任何错误或警告,并且生成的.jar运行正常。

最近,我决定创建一个使用的ant构建文件。每当我用ant编译同一个类时,我都会得到“常量字符串太长”的编译错误。我已经尝试了很多方法在ant中设置java编译器可执行文件,以确保我使用与Eclipse中完全相同的版本。

我宁愿弄清楚如何在Ant中获得相同的成功编译,而不是尝试重新编写代码来动态连接字符串。

11 个答案:

答案 0 :(得分:35)

有人试图给你发一条消息:-)当你花时间摆弄编译器版本时,你可以从文本文件中加载数据 - 这可能是它所属的地方。

退房:

答案 1 :(得分:28)

我发现我可以使用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!!!" 
} );

答案 2 :(得分:5)

在UTF-8编码中,类文件中字符串常量的长度限制为2 ^ 16字节,这不应取决于所使用的编译器。也许你在ant文件中使用的是不同于eclipse的字符集,因此某些字符需要比以前更多的字节。请检查encoding任务的javac属性。

答案 3 :(得分:4)

以上对我没有任何作用。我已经创建了一个名为test.txt的文本文件,并使用以下代码读取了该文本文件

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

答案 4 :(得分:3)

一种解决方法是使用new String()(喜欢)或StringBuilder对字符串进行分块,例如

String CONSTANT = new String("first chunk") 
                + new String("second chunk") + ... 
                + new String("...");

String CONSTANT = new StringBuilder("first chunk")
                .append("second chunk")
                .append("...")
                .toString();

如果您要生成此字符串,这些可能是可行的选择,例如从代码生成器。串联字符串文字的变通方法documented in this answer在Java 11中不再起作用

答案 5 :(得分:1)

另一个技巧,如果我决定在源代码中放入一个长字符串,就是避免编译器将其检测为常量表达式。

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

这工作了一段时间,但是如果你继续走得太远,下一个问题是编译器中的堆栈溢出。 This描述了同样的问题,如果您仍然确定,如何增加堆栈 - 问题似乎是现在方法的庞大规模。再次,这不是Eclipse中的一个问题。

答案 6 :(得分:0)

你试过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编译项目的任何一种方式都可以真正开始限制你很多方式。

答案 7 :(得分:0)

<ion-option-button ng-disabled="name.value!='peter'" class="button-calm"ng-click="edit(data)">
      Edit
  </ion-option-button>

答案 8 :(得分:0)

将字符串添加到values / strings.xml而不是调用getResources.getString(R.string.yourstring)

答案 9 :(得分:-1)

我能够以类似Lukas Eder的方式解决此问题。

String testXML = "REALLY LONG STRING...............................";
       textXML += "SECOND PART OF REALLY LONG STRING..........";
       textXML += "THIRD PART OF REALLY LONG STRING............";

只需将其拆分并添加在一起;

答案 10 :(得分:-4)

你可以试试这个,

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