Gradle сборка нескольких проектов с пустыми проектами

При применении структуры проекта gradle к нашему проекту моя settings.gradle выглядит следующим образом:

include "source:compA:api"
include "source:compA:core"
include "source:compB"

gradle проекты дают мне

Root project 'tmp'
\--- Project ':source'
     +--- Project ':source:compA'
     |    +--- Project ':source:compA:api'
     |    \--- Project ':source:compA:core'
     \--- Project ':source:compB'

Это именно структура каталогов!
В моем корневом каталоге у меня есть build.gradle, который применяет java-плагин ко всем подпроектам:

subprojects {
    apply plugin: 'java'
}

При создании я получаю артефакты для: source: compA, которые пусты, потому что на самом деле это не проект, только подкаталоги api и core являются подходящими java-проектами.

Каков наилучший способ избежать пустого артефакта?

Ответ 1

Вы можете попробовать использовать трюк, который они используют в Gradle свой файл settings.gradle. Обратите внимание, как каждый из подпроектов находится в папке 'subprojects/${projectName}', но сама папка subprojects не является проектом.

Итак, в вашем случае вы бы сделали что-то вроде:

include "source:compA-api"
include "source:compA-core"
include "source:compB"

project(':source:compA-api').projectDir = new File(settingsDir, 'source/compA/api')
project(':source:compA-core').projectDir = new File(settingsDir, 'source/compA/core')

Я намеренно пропустил двоеточие между compA и api, чтобы убедиться, что source:compA не получает оценку как контейнер проекта.

В качестве альтернативы вы можете попробовать исключить проект source:compA из того, что к нему применен плагин java, выполнив что-то вроде:

def javaProjects() { 
  return subprojects.findAll { it.name != 'compA' }
} 

configure(javaProjects()) { 
  apply plugin: 'java' 
} 

Edit: В качестве альтернативы вы можете попробовать что-то вроде этого (настройте на свой вкус):

def javaProjects() { 
  return subprojects.findAll { new File(it.projectDir, "src").exists() }
} 

configure(javaProjects()) { 
  apply plugin: 'java' 
}