Java 爪哇语;常量字符串太长“;编译错误。仅在使用Ant时发生,而不是在使用Eclipse时发生
我在一个类中有几个很长的字符串用于初始化用户信息。当我在Eclipse中编译时,我没有收到任何错误或警告,并且生成的.jar运行良好 最近,我决定创建一个ant构建文件以供使用。每当我用ant编译同一个类时,就会出现“常量字符串太长”编译错误。我尝试了多种方法在ant中设置java编译器可执行文件,以确保使用的版本与Eclipse中的版本完全相同Java 爪哇语;常量字符串太长“;编译错误。仅在使用Ant时发生,而不是在使用Eclipse时发生,java,eclipse,ant,Java,Eclipse,Ant,我在一个类中有几个很长的字符串用于初始化用户信息。当我在Eclipse中编译时,我没有收到任何错误或警告,并且生成的.jar运行良好 最近,我决定创建一个ant构建文件以供使用。每当我用ant编译同一个类时,就会出现“常量字符串太长”编译错误。我尝试了多种方法在ant中设置java编译器可执行文件,以确保使用的版本与Eclipse中的版本完全相同 我宁愿想办法获得与我在Eclipse中在Ant中获得的相同的成功编译,也不愿尝试重新编写代码以动态连接字符串。有人试图向您发送一条消息:-)在您花时间
我宁愿想办法获得与我在Eclipse中在Ant中获得的相同的成功编译,也不愿尝试重新编写代码以动态连接字符串。有人试图向您发送一条消息:-)在您花时间摆弄编译器版本时,您可以从文本文件加载数据-这可能就是它的位置属于 退房:
- 你试过了吗?我自己从未尝试过,但以下是相关部分:
使用Antjavac适配器
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编译项目都会在很多方面限制您。类文件中字符串常量的长度在UTF-8编码中被限制为2^16字节,这不应取决于所使用的编译器。也许您在ant文件中使用的字符集与eclipse中不同,因此某些字符需要比以前更多的字节。请检查
javac
任务的encoding
属性。我发现我可以使用apachecommons-lang方法来解决这个问题
public static final String CONSTANT = org.apache.commons.lang.StringUtils.join( new String[] {
"This string is long",
"really long...",
"really, really LONG!!!"
} );
如果我决定在源代码中放入一个长字符串,另一个技巧是避免编译器将其检测为常量表达式
String dummyVar = "";
String longString = dummyVar +
"This string is long\n" +
"really long...\n" +
"really, really LONG!!!";
这在一段时间内有效,但如果您继续走得太远,下一个问题是编译器中的堆栈溢出。描述了同样的问题,如果您仍然确定如何增加堆栈,那么现在的问题似乎是该方法的规模。这在Eclipse中也不是问题。将字符串添加到values/strings.xml中,然后调用getResources.getString(R.string.yourstring)您可以尝试这样做
public static final String CONSTANT = new StringBuilder("Your really long string").toString();
以上这些对我都不起作用。我创建了一个名为test.txt的文本文件,并使用下面的代码读取该文本文件
String content = new String(Files.readAllBytes(Paths.get("test.txt")));
解决方法是使用
newstring()
(yikes)或StringBuilder
,例如
String CONSTANT = new String("first chunk")
+ new String("second chunk") + ...
+ new String("...");
或
如果您正在生成此字符串(例如,从代码生成器生成),则这些选项是可行的。串接字符串文本的解决方法不再适用于Java 11,我可以用类似于Lukas Eder的方式解决这个问题
String testXML = "REALLY LONG STRING...............................";
textXML += "SECOND PART OF REALLY LONG STRING..........";
textXML += "THIRD PART OF REALLY LONG STRING............";
只需将其拆分并添加到一起 您可能意识到,您的字符串太长了。作为黑客,您可以在源代码中将其拆分为多个字符串,并将它们连接起来。这就是eclipse java编译器代表您所做的。添加一些细节/解释?当我需要快速测试某些东西时,我发现这是一个非常简洁的解决方案。谢谢你,你救了我一天:)我意识到这个答案并没有真正回答最初的问题,它只是一个变通方法。我不建议将其用于生产代码,只是为了快速和肮脏的测试目的。这会有同样的问题,字符串常量太长。这也会起作用,但不适用于长的单个字符串。如果你把绳子分成几部分,它就会起作用。公共静态最终字符串常量=新的StringBuilder(“不太长的字符串”).append(“另一个不太长的字符串”).append(“另一个字符串”).toString();2^16字节好的!这是否意味着我的字符串在UTF-8模式下应该只有65536个字符?我想这是最好的选择,将内容存储在一个单独的文件中,而不是存储在java源代码本身中。我在让这段代码正常工作时遇到了一些麻烦。有关.readAllBytes的完整代码以及您必须导入的内容,请参阅,这对我很有帮助。
String CONSTANT = new StringBuilder("first chunk")
.append("second chunk")
.append("...")
.toString();
String testXML = "REALLY LONG STRING...............................";
textXML += "SECOND PART OF REALLY LONG STRING..........";
textXML += "THIRD PART OF REALLY LONG STRING............";