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

时间:2019-05-20 07:16:10

标签: spring-boot gradle

我看过这篇文章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模块使用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模块和3pp-b模块仅包含一些配置文件和启动脚本。没有Java或任何已编译的代码。如何将它们分别打包为tar文件(不压缩)?

如何在dist-module中定义对其他模块的依赖关系?从dist-module触发构建时是否可以构建其他模块?

更新

我根据@ marco-r的答案设置了我的测试项目,除了打包war文件之外,它都有效。从github https://github.com/KiranMohan/study-spring-boot检出测试项目。

这是您感兴趣的项目设置。

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'

但是,向sb-2.1-build.tar.gz添加hello-rest-war失败。
而不是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"
        }
    }
}

包装内容

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模块)并且没有所有传递依赖项?

1 个答案:

答案 0 :(得分:1)

这是一个多问题的场景,所以我将分部分解决。

  
      
  1. 由于所有3PP_X_module具有相同的构建要求,因此在每个子模块中创建一个build.gradle,这些子模块引用具有所需通用功能的实际构建gradle:
  2.   
apply from: '../tarArtifact.gradle'
  
      
  1. 在父文件夹中,创建先前引用的tarArtifact.gradle,以具有对引用子项目的子文件夹(任意选择为contents)的内容进行TAR功能的功能:
  2.   
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配置可用于检索所需的{{1} }作为自然构建此项目的结果。

  
      
  1. TAR中创建以下dist-module文件:
  2.   
build.gradle

此gradle文件包括以下内容:

  • 应用Distribution plugin,因此我们可以从所有其他子项目生成的工件中生成最终的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 } } } 文件。
  • tar.gz插件的distTar任务配置为使用DistributionPlugin使用它压缩任何生成的TAR
  • 创建配置GZIP来捕获wholeProjectDist本身的依赖关系;我们将在分发插件的任务中使用它。
  • dist-module的依赖项声明为兄弟姐妹的子项目输出的工件;使用新创建的dist-module
  • 将发行版的插件wholeProjectDist配置为将main中的所有文件都作为contents
  
      
  1. configurations.wholeProjectDist下创建一个settings.gradle文件,以允许其使用dist-module访问其兄弟模块:
  2.   
includeFlat
  
      
  1. 在父文件夹中包含一个includeFlat '3pp-a-module', '3pp-b-module', 'lib-java-module', 'spring-boot-module' 文件,以包含所有子子模块(作为根项目):
  2.   
settings.gradle
  
      
  1. 通过调用gradle命令(从根文件夹)来构建所需的includeFlat '3pp-a-module', '3pp-b-module', 'lib-java-module', 'spring-boot-module' 文件:
  2.   
tar.gz

希望这会有所帮助。