gradle - Gradle允许zip存档中两个具有相同名称的文件

标签 gradle

我有一个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'
    }
}

我假设第二个from...include将覆盖第一个myFile.txt。相反,这是结果存档的结构:
myArchive.zip
├── myFile.txt    # 10kB
└── myFile.txt    # 20kB

这导致一些奇怪的行为:
  • 当我打开文件并将一个myFile.txt的名称更改为myFile.txt.bkup(通过WinZip)时,两个文件都相应地更改了名称。
  • 这两个文件都报告其原始大小(10kB和20kB),但是它们的内容是相同的-具体来说,就是myFile.txt中后者foo/baz的大小。

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

    最佳答案

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

    Gradle Zip

    ZipOutputStream

    关于gradle - Gradle允许zip存档中两个具有相同名称的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49283801/

    相关文章:

    java - Gradle构建-从子项目而不是从根项目工作

    android - 无法合并dex Android

    android - 使用 Robolectric 和 ORMLite 进行测试时使用模拟数据库

    android - Gradle 构建失败 : cannot run a program

    jsp - 预编译 JSP 的正确 WEB-INF 路径是什么?

    hibernate - 从Gradle使用Hibernate工具Ant任务

    android - 配置 Android 构建变体的错误重新声明类

    android - 错误 :Execution failed for task ':app:transformClassesWithJarMergingForDebug' on facebook accesstoken. 类

    java - gradle 包装器报告 Mac m1 上的 x86-64 架构而不是 arm-v8 架构

    java - 如何在 Github 包中添加我的 Android 库的依赖项?