Как игнорировать сборку 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)
    }
}
Другие вопросы по тегам