Java 爪哇语;常量字符串太长“;编译错误。仅在使用Ant时发生,而不是在使用Eclipse时发生

Java 爪哇语;常量字符串太长“;编译错误。仅在使用Ant时发生,而不是在使用Eclipse时发生,java,eclipse,ant,Java,Eclipse,Ant,我在一个类中有几个很长的字符串用于初始化用户信息。当我在Eclipse中编译时,我没有收到任何错误或警告,并且生成的.jar运行良好 最近,我决定创建一个ant构建文件以供使用。每当我用ant编译同一个类时,就会出现“常量字符串太长”编译错误。我尝试了多种方法在ant中设置java编译器可执行文件,以确保使用的版本与Eclipse中的版本完全相同 我宁愿想办法获得与我在Eclipse中在Ant中获得的相同的成功编译,也不愿尝试重新编写代码以动态连接字符串。有人试图向您发送一条消息:-)在您花时间

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

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


我宁愿想办法获得与我在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............";