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`错误