Gradle Zip:保留目录结构

Gradle Zip: retain the directory structures

我正在创建我的 java 文件的 Zip,如下所示,但它不保留 .zip

中的目录结构
task ('apiJavaDocSources', type: Zip) {

    from fileTree('core-module/src/mypackage/').matching {
        'subpackage/*Exception.java'
        'subpackage/package-info.java'
        'anotherpackage/*.java'
    }

    from fileTree('lib-module/src/mypackage/').matching {
        'bundleinfo/*Dummy.java'
        'bundleinfo/Random.java'
    }
    archiveName 'api-javadoc-sources.zip'
    destinationDir(file('image'))
}

我想保留 zip 中的目录结构为

  api-javadoc-sources.zip
   -- core-module
      -- /src/mypackage/
        -- subpackage/*.java
        -- anotherpackage/*.java
   -- lib-module
      -- /src/mypackage/
        -- bundleinfo/*.java

但是,我的实现只是将所有 *.java 放在 .zip 的根目录中,我怎样才能在 zip 中保留此处的目录结构?

fileTree() 方法不会保留您从中采购的目录层次结构。您需要在复制规范中指定 into 目录,以指定您希望将匹配的文件放置在 zip 内的目录中。

以下任务应该可以完成您想要的:

task ('apiJavaDocSources', type: Zip) {
    // search for files in this directory
    from('core-module/src/mypackage') {
        // indicates that all matches files should be nested in this directory inside of the zip
        into 'core-module/src/mypackage'
        // match file patterns
        include 'subpackage/*Exception.java'
        include 'subpackage/package-info.java'
        include 'anotherpackage/*.java'
    }

    from('lib-module/src/mypackage') {
        into 'lib-module/src/mypackage'
        include 'bundleinfo/*Dummy.java'
        include 'bundleinfo/Random.java'
    }
    
    archiveName 'api-javadoc-sources.zip'
    destinationDir(file('image'))
}