Gradle Zip: сохранение структур каталогов

#java #gradle #build #build.gradle

#java #gradle #сборка #build.gradle

Вопрос:

Я создаю Zip-файл своих файлов Java, как показано ниже, но он не сохраняет структуру каталогов в .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?

Ответ №1:

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'))
}