Соберите все артефакты сборки gradle в один каталог

Мы переходим с Maven на Gradle и боремся с одной вещью. У нас есть многопроектный Gradle-проект, основанный на POM от Maven. Большинство из них работает нормально, но мы не можем найти способ собрать WAR-файлы и ZIP-файлы, которые являются результатом сборки подпроектов. Каждый подпроект представляет собой микросервис. Мы нашли (также на Stackoverflow) способы собрать все jar-файлы и сторонние библиотеки в каталог. Однако мы ищем способ собрать ресурсы и библиотеки для каждого микросервиса. В Maven мы сделали что-то вроде этого:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>3.0.0</version>
            <executions>
                <execution>
                    <id>copy</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>Publish/</outputDirectory>
                        <artifactItems>
                            <artifactItem>
                                <groupId>....</groupId>
                                <artifactId>...</artifactId>
                                <version>${project.version}</version>
                                <type>zip</type>
                            </artifactItem>
                            <artifactItem>
                                <groupId>....</groupId>
                                <artifactId>...</artifactId>
                                <version>${project.version}</version>
                                <type>war</type>
                            </artifactItem>

Я хотел бы получить каталог, в котором я могу найти:

project1.war
project2.war
project3.zip
etc.

person Pieter    schedule 19.08.2017    source источник


Ответы (2)


Следующее решение создано вручную, но оно простое и обеспечивает гибкость, если вам нужно что-то настроить.

Ниже build.gradle в корневом каталоге. Для каждого подпроекта это будет:

  • Определите задачу copyArtifacts, которая копирует файлы war и zip из папки build/libs подпроекта (используя соответствующие baseName, version и т. д.) в root/dist.
  • Если задача war найдена, то настройте ее так, чтобы впоследствии она запускала copyArtifacts.

Это можно легко изменить, чтобы искать другие имена задач, сопоставлять разные имена файлов и т. д. (может потребоваться удалить старые версии данного артефакта перед копированием и т. д.).

subprojects { Project subProject ->
    task copyArtifacts {
        doLast {
            def baseName = subProject.archivesBaseName
            def version = subProject.version
            def group = subProject.group
            def DIST_DIR = "${rootDir}/dist"
            def SRC_DIR = "${buildDir}/libs"

            ant.mkdir(dir: DIST_DIR)
            ant.copy(todir: DIST_DIR) {
                fileset(dir: SRC_DIR,
                includes: "${baseName}*${version}*.war,${baseName}*${version}*.zip")
            }
        }
    }

    afterEvaluate {
        def warTask = subProject.tasks.find { it.name == 'war' }
        if (warTask) { 
            warTask.finalizedBy(copyArtifacts)
        }
    }
}
person Michael Easter    schedule 19.08.2017
comment
Это почти работает, но ZIP-файлы хранятся в каталоге дистрибутивов. Я добавил вторые задачи для проектов, которые создали ZIP. Это работает, и мне нужно было изменить только основной build.gradle, а не какой-либо из подпроектов. Кажется, так проще управлять. - person Pieter; 20.08.2017

В каждом из проектов, создающих артефакт (например, zip), вы добавите артефакт в конфигурацию. См. управление артефактами.

eg:

configurations {
   archives
}
task myZip(type: Zip) { ... }
artifacts {
   archives myZip
}

Затем в проекте uber вы будете использовать другую конфигурацию для ссылки на артефакты и задачу zip для их объединения.

configurations {
   uber
}
dependencies {
   uber project(path: ':project1', configuration: 'archives')
   uber project(path: ':project2', configuration: 'archives')
   uber project(path: ':project3', configuration: 'archives')
}
task uberZip(type: Zip) {
   from configurations.uber
   archiveName 'uber.zip'
   destinationDir "$buildDir/uber"
}    
person lance-java    schedule 19.08.2017
comment
Выглядит интересно, так как использует встроенный функционал. Однако мне нужен не uber-zip, а несколько артефактов по умолчанию (WAR и ZIP), скопированных в центральный каталог. Я не знаю, возможно ли это с этими функциями? - person Pieter; 20.08.2017
comment
Просто замените задачу uberZip задачей uberCopy типа Copy. Вы можете сохранить пункт from - person lance-java; 20.08.2017