Как игнорировать сборку gradle корневого проекта для многопроектного приложения Kotlin Spring Boot?
Задний план:
В настоящее время у меня есть репозиторий многомодульных (многопроектных) приложений. "Корень" - это не работающее приложение. Это просто исходный каталог, в котором у меня есть кореньbuild.gradle.kts
файл, который содержит зависимости и плагины, общие для всех моих подпроектов. У каждого из моих подпроектов есть своиbuild.gradle.kts
.
Итак, моя общая структура проекта выглядит примерно так:
my_root_project
- gradle
- wrapper
- gradle-wrapper.jar
- gradle-wrapper.properties
- gradle.build.kts
- settings.gradle.kts
- my_nested_project_a
- src
- main
- kotlin
- my_nested_project_b
...
Проблема:
Каждый раз, когда я бегу gradle build
, Я получаю сообщение об ошибке:
> Task :bootJar FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':bootJar'.
> Main class name has not been configured and it could not be resolved
Однако, когда я запускаю какой-либо из своих подпроектов (например, build :my_nested_project_a:build
), он строится отлично.
Текущие файлы сборки Gradle
Вот что у меня сейчас в "корне" gradle.build.kts
:
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
group = "com.example"
version = "1.0.0"
java.sourceCompatibility = JavaVersion.VERSION_1_8
java.targetCompatibility = JavaVersion.VERSION_1_8
plugins {
id("org.springframework.boot") version "2.1.8.RELEASE" apply false
id("io.spring.dependency-management") version "1.0.8.RELEASE" apply false
kotlin("jvm") version "1.3.50"
kotlin("plugin.spring") version "1.3.50"
kotlin("plugin.jpa") version "1.3.50"
kotlin("plugin.allopen") version "1.3.50"
}
allprojects {
repositories {
maven(url = "https://my.company.com/repo/with/all/the/stuff/I/need")
}
apply(plugin = "org.jetbrains.kotlin.jvm")
apply(plugin = "java")
apply(plugin = "org.springframework.boot")
apply(plugin = "io.spring.dependency-management")
apply(plugin = "org.jetbrains.kotlin.plugin.spring")
dependencies {
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("org.jetbrains.kotlin:kotlin-reflect")
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
}
tasks.withType<KotlinCompile> {
kotlinOptions {
freeCompilerArgs = listOf("-Xjsr305=strict")
jvmTarget = "1.8"
}
}
}
ПРИМЕЧАНИЕ: я использую
apply false
в моих плагинах, потому что я думал, что это помешает gradle попытаться найти основной класс при создании с использованиемgradle build
.
Что я пытаюсь сделать:
У меня есть конвейер CI, который я хотел бы просто запустить gradle build
который должен запустить build
задача для всех подпроектов. Однако в этом процессе я хотел бы проигнорировать запуск сборки для "корневого" проекта или обойти его, поскольку это не работоспособное приложение, а просто построить подпроекты.
Любая помощь будет принята с благодарностью!:)
4 ответа
Если вы хотите игнорировать задачу bootJar
, поэтому добавьте следующую конфигурацию.
bootJar {
enabled = false
}
В вашем корне build.gradle.kts
, игнорировать bootJar
задача с Kotlin DSL:
import org.springframework.boot.gradle.tasks.bundling.BootJar
tasks.getByName<BootJar>("bootJar") {
enabled = false
}
Если у вас есть плагин в allprojects
сеанс, вы также применяете его к корню, и поскольку он первый разрешен в gradle build
, у вас должен быть настроен основной класс.
В качестве альтернативы вы можете удалить apply(plugin = "org.springframework.boot")
строку из корня и примените плагин только к модулю, имеющему main
метод, аннотированный @SpringBootApplication
, и укажите там плагин на основной класс.
Скажите, что ваш основной класс находится в my_nested_project_a/src/main/com/example/MainClass.kt
.
Ваш my_nested_project_a/build.gradle.kts
должно выглядеть так:
plugins {
id("org.springframework.boot")
}
springBoot {
mainClassName = "com.example.MainClass"
}
dependencies {
...
}
И вы должны удалить эту строку из корня build.gradle.kts
:
apply(plugin = "org.springframework.boot")
У меня аналогичная установка и вопрос. Я заменил
allprojects
с участием
subprojects
и добавил
jar.enabled(false)
в корневой файл build.gradle, и он сработал.
plugins {
id("java-library")
id('org.jetbrains.kotlin.jvm') version "${kotlinVersion}"
id("com.diffplug.spotless") version "${spotlessVersion}"
id("maven-publish")
}
jar.enabled(false)
subprojects {
apply plugin: "java-library"
apply plugin: "org.jetbrains.kotlin.jvm"
apply plugin: "com.diffplug.spotless"
apply plugin: "maven-publish"
group = GROUP
version = VERSION_NAME
java {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
dependencies {
testImplementation 'org.jetbrains.kotlin:kotlin-test'
testImplementation("org.junit.jupiter:junit-jupiter:${junitVersion}")
}
publishing {
publications {
library(MavenPublication) {
from components.java
}
}
repositories {
maven {
url "https://gitlab.mhighpoint.com/api/v4/projects/${System.getenv('CI_PROJECT_ID')}/packages/maven"
credentials(HttpHeaderCredentials) {
name = "Job-Token"
value = System.getenv('CI_JOB_TOKEN')
}
authentication {
header(HttpHeaderAuthentication)
}
}
}
}
spotless {
java {
googleJavaFormat() // googleJavaFormat('1.1') to specify a specific version
}
kotlin {
target '**/src/**/*.kt'
ktlint("0.41.0").userData('disabled_rules': 'no-wildcard-imports,import-ordering')
trimTrailingWhitespace()
indentWithSpaces()
endWithNewline()
}
format 'misc', {
target '**/*.gradle'
trimTrailingWhitespace()
indentWithSpaces() // or spaces. Takes an integer argument if you don't like 4
endWithNewline()
}
}
test {
useJUnitPlatform()
}
jar {
archiveBaseName = "${rootProject.name}-${project.name}"
}
tasks {
assemble.dependsOn(spotlessApply)
}
}