我在一个类中有一些非常长的字符串用于初始化用户信息。当我在Eclipse中编译时,我没有收到任何错误或警告,并且生成的.jar运行正常。
最近,我决定创建一个使用的ant构建文件。每当我用ant编译同一个类时,我都会得到“常量字符串太长”的编译错误。我已经尝试了很多方法在ant中设置java编译器可执行文件,以确保我使用与Eclipse中完全相同的版本。
我宁愿弄清楚如何在Ant中获得相同的成功编译,而不是尝试重新编写代码来动态连接字符串。
答案 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();