【问题标题】:How to ignore gradle build of root project for a multi-project Kotlin Spring Boot application?如何忽略多项目 Kotlin Spring Boot 应用程序的根项目的 gradle 构建?
【发布时间】:2020-02-05 03:18:52
【问题描述】:

背景:

我目前有一个多模块(多项目)应用程序存储库。 “根”不是可运行的应用程序。它只是我有一个根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 build 构建时,它会阻止 gradle 尝试查找主类。

我想做的事:

我有一个 CI 管道,我想简单地运行 gradle build,它应该为所有子项目运行 build 任务。但是,在这个过程中,我想忽略为“根”项目运行构建或绕过它,因为它不是一个可运行的应用程序,而只是构建子项目。

任何帮助将不胜感激! :)

【问题讨论】:

    标签: spring-boot gradle kotlin gradle-multi-project-build


    【解决方案1】:

    如果您想忽略任务bootJar,请添加以下配置。

    bootJar {
        enabled = false
    }
    

    【讨论】:

    • 我是 Gradle 新手,所以如果我问的很明显,请原谅我。这是 Kotlin DSL 语法吗?另外,我尝试将它添加到我的根 gradle.build.kts 文件中(在任何其他任务之外),但我遇到了编译错误。我应该把它放在一个特定的地方吗?
    【解决方案2】:

    在您的根 build.gradle.kts 中,使用 Kotlin DSL 忽略 bootJar 任务:

    import org.springframework.boot.gradle.tasks.bundling.BootJar
    
    tasks.getByName<BootJar>("bootJar") {
        enabled = false
    }
    

    【讨论】:

      【解决方案3】:

      如果您在allprojects 会话中应用了该插件,那么您也将它应用到根,并且由于它是在gradle build 中解决的第一个,您应该在那里配置主类。

      或者,您可以从根目录中删除 apply(plugin = "org.springframework.boot") 行,并将插件仅应用于具有使用 @SpringBootApplication 注释的 main 方法的模块,并将插件指向那里的主类。

      假设你的主要课程在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")
      

      【讨论】:

        【解决方案4】:

        我有类似的设置和问题。我将allprojects 替换为subprojects 并将jar.enabled(false) 添加到root 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)
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2020-04-13
          • 1970-01-01
          • 2021-10-29
          • 1970-01-01
          • 2020-03-13
          • 1970-01-01
          • 2021-11-01
          • 2018-08-29
          • 2019-06-08
          相关资源
          最近更新 更多