Java jar MANIFEST.MF最大行长72是否包含EOL字节

Java jar MANIFEST.MF最大行长72是否包含EOL字节,java,jar,manifest.mf,Java,Jar,Manifest.mf,关于直线的确切定义,我的理解有点模糊。特别是读到 在UTF8编码形式下,任何行的长度不得超过72字节(非字符) 我不确定这方面的行是否包含EOL(CR-LF | LF | CR)字符 我有两个库的第三方实现,它们编写清单,其中一个生成的内容似乎包含下线字符作为行的一部分,另一个不包含下线字符。虽然这并不是严格地回答规范所说的行是什么意思的问题,但它确实回答了JDK如何使用的问题围绕该规范实现了其清单支持。您希望它们都来自同一个团队,因此规范中的任何歧义都可以通过实现的细节来澄清,但我暂时不接受这

关于直线的确切定义,我的理解有点模糊。特别是读到

在UTF8编码形式下,任何行的长度不得超过72字节(非字符)

我不确定这方面的行是否包含EOL(
CR-LF | LF | CR
)字符


我有两个库的第三方实现,它们编写清单,其中一个生成的内容似乎包含下线字符作为行的一部分,另一个不包含下线字符。

虽然这并不是严格地回答规范所说的行是什么意思的问题,但它确实回答了JDK如何使用的问题围绕该规范实现了其清单支持。您希望它们都来自同一个团队,因此规范中的任何歧义都可以通过实现的细节来澄清,但我暂时不接受这一点,以防找到更规范的答案

通过阅读JDK源代码并使用JDK清单类运行一些测试来写出清单文件,我可以说JDK(版本1.7)写出了清单条目,其中行长度包括EOL字节

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.jar.Attributes;
import java.util.jar.Manifest;

import static java.nio.charset.StandardCharsets.UTF_8;
import static java.util.jar.Attributes.Name.MANIFEST_VERSION;

public class ManifestTest {
  public static void main(String[] args) throws IOException {
    Manifest m = new Manifest();
    Attributes a = m.getMainAttributes();
    a.put(MANIFEST_VERSION, "1.0"); // required or the file doesn't get written

    // Long-Property: This line has 72 characters without eol, it's hard to get
    a.putValue("Line-Property", "This line has 72 characters without eol, it's hard to get");
    // Long-Property: This line has 72 characters with eol, it is hard to get
    a.putValue("Long-Property", "This line has 72 characters with eol, it is hard to get");
    a.putValue("Massive-Property", "This line wraps around always as it has a lot of characters in it");

    ByteArrayOutputStream out = new ByteArrayOutputStream();
    m.write(out);
    System.out.println(new String(out.toByteArray(), UTF_8));
  }
}
结果如下所示:

Manifest-Version: 1.0
Long-Property: This line has 72 characters with eol, it is hard to get
Massive-Property: This line wraps around always as it has a lot of cha
 racters in it
Line-Property: This line has 72 characters without eol, it's hard to g
 et

请注意,
Long属性
适合一行,因为行内容是70个字符+2个EOL字符,我应该指出,在计算行长度时,我更信任不包含EOL字节的库(bnd),而不是信任包含EOL字节的库,因此我更倾向于这样理解,但是,如果能得到一些确认,我们将不胜感激。也许这将有助于感谢指针@KonstantinV.Salikhov在阅读源代码后,我在下面发布了一个基于代码的模糊答案,而不是规范中的任何额外澄清。我在上面的评论中回复了我对bnd库的最初信任,似乎我是考虑JDK如何处理清单文件的输出时,这是不正确的。JDK计算下线,BND不计算下线。这样做的唯一原因是,当再次读取清单文件时,JDK在检查行长度方面很松懈。
Manifest m = new Manifest();
String longManifest = "Manifest-Version: 1.0\r\n" +
    "Too-Long: This line is longer than 72 characters, does the Manifest class correctly \r\n" +
    " handle parsing of it even over multiple lines?\r\n";
m.read(new ByteArrayInputStream(longManifest.getBytes(UTF_8)));
System.out.println(m.getMainAttributes().getValue("Too-Long"));