Как собрать дистрибутив в мультимодульном проекте Gradle? - PullRequest
2 голосов
/ 20 мая 2019

Я видел этот пост Многопроектный дистрибутив Gradle , но все еще есть некоторые сомнения.
Я хотел бы создать следующий макет проекта

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-модуль собирал myapp-dist.tar.gz с помощью libjava.jar, sprintbootapp.jar, 3pp-a.tar, 3pp-b.tar.

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, и он работает, за исключением упаковки файла войны. Оформить заказ на тестовый проект от 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'

Однако добавить hello-rest-war в sb-2.1-build.tar.gz не удается.
Вместо военных файлов, это зависимости, которые упаковываются.

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 Ответ

1 голос
/ 21 мая 2019

Это сценарий с несколькими вопросами, поэтому я собираюсь рассмотреть его по частям.

  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 подключена к выходу tarContents (builtBy: 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 , поэтому мы можем сгенерировать окончательный файл tar.gz из артефактов, сгенерированных всеми другими подпроектами.
  • Конфигурирует задачу distTar (из плагина DistributionPlugin) для сжатия любого сгенерированного TAR, используя его с помощью GZIP.
  • Создает конфигурацию wholeProjectDist для захвата зависимостей самого dist-module; которые мы будем использовать с задачами модуля распространения.
  • Объявляет зависимости dist-module как артефакты, выводимые подпроектами братьев и сестер; используя только что созданный wholeProjectDist.
  • Конфигурирует конфигурацию плагина main для дистрибутива, чтобы иметь contents все файлы из configurations.wholeProjectDist
  1. Создайте файл settings.gradle в dist-module, чтобы разрешить ему доступ к своим родным модулям, используя 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. Создайте нужные файлы tar.gz, вызвав команду gradle (из корневой папки):
gradle :dist-module:distTar

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...