将所有 gradle 构建工件组装到一个目录中

Pie*_*ter 5 multi-project gradle

我们正在从 Maven 迁移到 Gradle,并且正在努力解决一件事。我们有一个基于 Maven 的 POM 的多项目 Gradle 项目。大部分工作正常,但我们找不到收集 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>
Run Code Online (Sandbox Code Playgroud)

我希望最终得到一个可以找到的目录:

project1.war
project2.war
project3.zip
etc.
Run Code Online (Sandbox Code Playgroud)

Mic*_*ter 2

以下解决方案是手动解决方案,但很简单,并且在您需要调整任何内容时提供了灵活性。

下面是build.gradle根目录中的一个。对于每个子项目,它将:

  • 定义一个copyArtifacts任务,将子项目的文件夹(使用适当的、等)复制war并归档到.zipbuild/libsbaseNameversionroot/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)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)