Gradle: общая зависимость ресурсов для нескольких проектов Java

Я разрабатываю проект с несколькими модулями с помощью gradle/intellij-idea, и вот структура моего дома проекта:

project/
  sub-project-1
    /main/resources
  sub-project-2
    /main/resources
  data
    /main/resources
    /test/resources

Как вы можете видеть, у меня есть несколько подпроектов (все java), как я могу заставить их зависеть от некоторых общих ресурсов (проект "данные", который не содержит кода, а только ресурсов), а также их собственные отдельные ресурсы?

Также лучше всего, чтобы intellij-идея могла автоматически подбирать эти зависимости с помощью JetGradle (JetGradle отлично справляется со стандартными зависимостями проекта gradle java в каждом подпроекте).

Спасибо большое!

Ответ 1

Одно из решений состоит в том, чтобы применить плагин Java также к проекту data, а затем использовать обычные зависимости проекта (например, dependencies { runtime project(":data") }). Однако для предотвращения отправки тестовых ресурсов потребуется немного усилий.

Другое решение состоит не в том, чтобы сделать data проектом Gradle, а в буквальном смысле включить его каталоги ресурсов в другие два проекта (sourceSets.main.resources.srcDir "../data/main/resources"; sourceSets.test.resources.srcDir "../data/test/resources").

Ответ 2

Подход, который я принял, заключался в использовании ссылки на проект

sourceSets {
    main {
        resources {
            srcDirs += [
                project(':data').sourceSets.main.resources
            ]
        }
    }
}

Ответ 3

Хорошо, я понял это. Это на самом деле довольно просто. Просто обработайте папку "data" в качестве другого проекта и добавьте объявления зависимостей в подпроекты, сделайте трюк. Например:

dependencies {
    compile project (':data')
    testCompile project (':data')
}

Ответ 4

Вам нужно выбрать проект, который будет содержать ваши ресурсы. Все остальные проекты, которым требуются эти ресурсы, добавят их в компонент resources sourceSets.

sourceSets {
    data {
        resources {
            srcDir "${project(':data').projectDir}/src/main/resources"
            include "your_pattern_here**"
        }
    }
    main {
        resources {
            srcDirs += [ data.resources ]
        }
    }
}

Ответ 5

А вот версия для Kotlin DSL - для синхронизации всех ресурсов от: модуля данных до корня и всех папок сборки/ресурсов подмодулей:

// Synchronizing resources from :data module to project root: build/resources
synchronizeSharedResources()

subprojects {
    // Synchronizing resources from :data module to all submodules: build/resources
    synchronizeSharedResources()
}

fun Project.synchronizeSharedResources() {
    sourceSets {
        main {
            resources.srcDir(project(":data").sourceSets["main"].resources.srcDirs)
        }
        test {
            resources.srcDir(project(":data").sourceSets["test"].resources.srcDirs)
        }
    }
}