java 如何在多模块Gradle项目中构建分发包?

fd3cxomn  于 2023-02-02  发布在  Java
关注(0)|答案(1)|浏览(148)

我看过这篇文章Gradle multi project distribution,但仍然有一些疑问。
我想创建以下项目布局

root
  |--lib-java-module
  |--spring-boot-module
  |--3PP_A_module         # not java 
  |       |-- custom scripts, config
  |--3PP_B_module         # not java 
  |       |-- custom scripts, config
  |--dist-module

正如您可能已经猜到的,我希望dist-module使用libjava.jar、sprintbootapp.jar、3pp-a.tar和3pp-b.tar来构建myapp-dist.tar.gz。

myapp-dist.tar.gz
   libjava.jar
   sprintbootapp.jar
   3pp-a.tar
   3pp-b.tar.

3pp-a-module和3pp-b-module只包含一些配置文件和启动脚本,没有java和编译代码,如何单独打包成tar文件(不压缩)?
如何定义dist-module对其他模块的依赖关系?当dist-module触发构建时,是否可以构建其他模块?

    • 更新日期:**

我根据@marco-r的答案设置了我的测试项目,除了打包war文件外,它工作正常。从github https://github.com/KiranMohan/study-spring-boot checkout 测试项目。
这是感兴趣的项目设置。

include ':sb-2.1-multi-package', ':sb-2.1-multi-package:hello-rest-lib', 
        ':sb-2.1-multi-package:hello-rest-standalone-jar',
        ':sb-2.1-multi-package:hello-rest-war'
include 'sb-2.1-3pp-resources'
include 'sb-2.1-build'

然而,将hello-rest-war添加到sb-2.1-build.tar.gz失败。
打包的不是war文件,而是依赖项。

dependencies {
    archivesDeps    project(path: ':sb-2.1-3pp-resources', configuration: 'archives')
    javaDeps project(":sb-2.1-multi-package:hello-rest-war")
}

...    
task copyJavaDeps(type: Copy) {
    inputs.files(configurations.javaDeps)
    from configurations.javaDeps
    into "${ARCHIVE_DIRECTORY}/lib"
}

...
// create distribution bundle
distributions {
    main {
        contents {
            from ARCHIVE_DIRECTORY
            into "/springapp/multimodule"
        }
    }
}

Package 内容物

springapp/multimodule/lib/classmate-1.4.0.jar
springapp/multimodule/lib/hello-rest-lib-0.0.1-SNAPSHOT.jar
springapp/multimodule/lib/hibernate-validator-6.0.16.Final.jar
...
springapp/multimodule/lib/tomcat-embed-websocket-9.0.17.jar
springapp/multimodule/lib/validation-api-2.0.1.Final.jar    
springapp/multimodule/sb-2.1-3pp-resources/config/3pp.json

如何打包war文件(hello-rest-war模块)并且不带任何传递依赖?

brccelvz

brccelvz1#

这是一个多问题的场景,所以我将分几部分来解决它。
1.由于所有3PP_X_module具有相同的构建要求,因此在每个子模块中创建一个build.gradle,这些子模块引用具有所需通用功能的实际构建等级:

apply from: '../tarArtifact.gradle'

1.在父文件夹中,创建之前引用的tarArtifact.gradle,使其具有TAR引用子项目的子文件夹(任意选择为contents)内容的功能:

apply plugin: 'base'

task tarContents(type: Tar) {
    from 'contents'
    archiveName = "${project.name}.tar"
    destinationDir file('build/tar')
}

artifacts {
    archives file: tarContents.archivePath, type: 'tar', builtBy: tarContents
}

由于archives配置连接到tarContentsbuiltBy: tarContents)的输出,因此可以使用archives配置检索所需的TAR,作为自然构建此项目的输出。
1.在dist-module中创建以下build.gradle文件:

apply plugin: 'distribution'

plugins.withType(DistributionPlugin) {
    distTar {
        compression = Compression.GZIP
        extension = 'tar.gz'
    }
}

configurations {
    wholeProjectDist
}

dependencies {
    wholeProjectDist project(path: ':3pp-a-module', configuration: 'archives')
    wholeProjectDist project(path: ':3pp-b-module', configuration: 'archives')
    wholeProjectDist project(':lib-java-module')
    wholeProjectDist project(':spring-boot-module')
}

distributions {
    main {
        contents {
            from configurations.wholeProjectDist
        }
    }
}

此gradle文件包括以下内容:

  • 应用Distribution plugin,这样我们就可以从所有其他子项目生成的工件中生成最终的tar.gz文件。
  • 使用GZIP配置distTar任务(DistributionPlugin插件的)以压缩使用该任务生成的任何TAR
  • 创建配置wholeProjectDist以捕获dist-module本身的依赖项;我们将在分发插件的任务中使用它。
  • dist-module的依赖项声明为兄弟项目的子项目输出的工件;使用新创建的wholeProjectDist
  • 配置发行版的插件main配置,使configurations.wholeProjectDist中的所有文件都成为contents

1.在dist-module下创建一个settings.gradle文件,以允许它使用includeFlat访问其兄弟模块:

includeFlat '3pp-a-module', '3pp-b-module', 'lib-java-module', 'spring-boot-module'

1.在父文件夹中包含一个settings.gradle文件,以包含所有子模块(作为根项目):

includeFlat '3pp-a-module', '3pp-b-module', 'lib-java-module', 'spring-boot-module'

1.通过调用gradle命令(从根文件夹)构建所需的tar.gz文件:

gradle :dist-module:distTar

相关问题