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

Posted

技术标签:

【中文标题】Java“常量字符串太长”编译错误。仅在使用 Ant 时发生,在使用 Eclipse 时不会发生【英文标题】:Java "constant string too long" compile error. Only happens using Ant, not when using Eclipse 【发布时间】:2011-02-13 21:05:35 【问题描述】:

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

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

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

【问题讨论】:

你的字符串太长了,你可能已经意识到了。作为一种技巧,您可以在源代码中将其拆分为多个字符串并将它们连接起来。这就是 eclipse java 编译器正在代表你做的事情。 【参考方案1】:

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

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

把它拆分然后加在一起;

【讨论】:

【参考方案2】:

一种解决方法是使用new String() (yikes) 或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

【讨论】:

【参考方案3】:

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

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

【讨论】:

我猜这是最好的选择,将内容存储在单独的文件中而不是 java 源代码本身中。 我在让这段代码工作时遇到了一些麻烦。请参阅 howtodoinjava.com/java/io/java-read-file-to-string-examples 以获取 .readAllBytes 的完整代码以及您必须导入的内容 - 它对我有帮助。【参考方案4】:

你可以试试这个,

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

【讨论】:

这会出现字符串常量过长的问题。 这也可以,但不适用于长的单个字符串。如果您将字符串分成几部分,它将起作用。 public static final String CONSTANT = new StringBuilder("Not so long string").append("another not so long string").append("another string").toString();【参考方案5】:

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

【讨论】:

【参考方案6】:

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

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

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

【讨论】:

【参考方案7】:

有人试图向您发送消息 :-) 在您花时间摆弄编译器版本时,您可能已经从文本文件加载数据 - 这可能是它所属的位置。

退房:

java.util.Properties Apache Commons FileUtils.readFileToString()

【讨论】:

【参考方案8】:
  String theString2 = IOUtils.toString(new FileInputStream(new     
  File(rootDir + "/properties/filename.text")), "UTF-8");

【讨论】:

添加一些细节/解释?【参考方案9】:

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

【讨论】:

当我需要快速测试某些东西时,我发现这是一个非常简洁的解决方案 谢谢你,你拯救了我的一天 :) 我意识到这个答案并没有真正回答原始海报的问题,它只是一种解决方法。我不建议将它用于生产代码,仅用于快速和肮脏的测试目的。 FWIW 我在这里 ***.com/a/2738598/1247302987654322@***.com/a/2738598/1247302【参考方案10】:

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

【讨论】:

2^16 字节好的!这是否意味着我的字符串在 UTF-8 模式下应该只有 65536 个字符?【参考方案11】:

你试过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 编译项目真的会开始限制你方法很多。

【讨论】:

以上是关于Java“常量字符串太长”编译错误。仅在使用 Ant 时发生,在使用 Eclipse 时不会发生的主要内容,如果未能解决你的问题,请参考以下文章

编译器错误 - 仅在从命令行编译时

仅在使用设备 arm_neon.h 时 Xcode6 编译错误

JN5189使用SDK 2.6.4编译JN-AN-1243/1246等项目报undefined reference to `BOARD_CpuClockUpdate32MhzFro`错误

JN5189使用SDK 2.6.4编译JN-AN-1243/1246等项目报undefined reference to `BOARD_CpuClockUpdate32MhzFro`错误

JN5189使用SDK 2.6.4编译JN-AN-1243/1246等项目报undefined reference to `BOARD_CpuClockUpdate32MhzFro`错误

是否可以仅在内存中以编程方式编译 java 源代码?