Gradle允许zip存档中有两个同名文件

Gradle允许zip存档中有两个同名文件,gradle,Gradle,我有一个gradle任务,buildZip,它将两个目录的内容放在一个目录中。两个目录都包含一个名称相同的文件,myFile.txt,但其内容不同。这是原始目录结构: foo/ ├── bar/ │ └── myFile.txt # 10kB └── baz/ └── myFile.txt # 20kB Gradle任务将两个文件都放在归档文件的根目录中: task buildZip(type: Zip) { archiveName 'myArchive.zip

我有一个gradle任务,
buildZip
,它将两个目录的内容放在一个目录中。两个目录都包含一个名称相同的文件,
myFile.txt
,但其内容不同。这是原始目录结构:

foo/
├── bar/
│   └── myFile.txt    # 10kB
└── baz/
    └── myFile.txt    # 20kB
Gradle任务将两个文件都放在归档文件的根目录中:

task buildZip(type: Zip) {
    archiveName 'myArchive.zip'
    includeEmptyDirs false

    from('foo/bar') {
      include 'myFile.txt'
    }
    from('foo/baz') {
      include 'myFile.txt'
    }
}
我假设来自…include的第二个
将覆盖第一个
myFile.txt
。相反,这是生成的存档的结构:

myArchive.zip
├── myFile.txt    # 10kB
└── myFile.txt    # 20kB
这会导致一些奇怪的行为:

  • 当我打开归档文件并将其中一个
    myFile.txt
    的名称更改为
    myFile.txt.bkup
    (通过WinZip)时,两个文件的名称都会相应更改
  • 这两个文件都报告了它们的原始大小(10kB和20kB),但它们的内容是相同的,特别是后者的
    myFile.txt
    from
    foo/baz

如果已经存在同名文件,Gradle为什么不自动覆盖存档中的文件?为什么可以在同一目录中创建两个同名文件而不覆盖其中一个?

我认为这是
org.apache.tools.zip.ZipOutputStream
(gradle使用它创建zip存档)的行为。在这个类中,首先编写zip条目头,我认为这就是zip文件看起来包含2个文件的原因。当它写入实际文件的流时,它会覆盖上一个文件的内容(因为名称相同)


查看代码,在覆盖原始文件流的同时,缓冲区大小似乎没有受到影响,即使内容发生了更改。这可以解释为什么文件看起来相同,但仍然报告其原始文件大小。这会使这成为一个错误,还是有这样的行为的原因?@Bucket我不是100%确定,但我认为这与内部的zip文件格式有关。OutputStream可能会在刷新时写入文件字节(这可能会覆盖4.3.7节(其中解释了本地文件头)中使用相同名称的上一个文件)