【问题标题】:Gradle, Kotlin, Multi Module Project: Getting build errors while compiling this projectGradle、Kotlin、多模块项目:编译此项目时出现构建错误
【发布时间】:2019-08-07 20:19:44
【问题描述】:

在根文件夹上运行 gradle build 命令时出现以下错误。

E:\Code\mdh>gradle build

> Task :multidemo:compileKotlin FAILED
e: E:\Code\mdh\multidemo\src\main\kotlin\com\simbalarry\multidemo\SampleController.kt: (3, 23): Unresolved reference: somelib
e: E:\Code\mdh\multidemo\src\main\kotlin\com\simbalarry\multidemo\SampleController.kt: (18, 12): Unresolved reference: Tester

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':multidemo:compileKotlin'.
> Compilation error. See log for more details

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 5s
4 actionable tasks: 1 executed, 3 up-to-date

下面是我的项目结构,multidemo 项目正在使用 somelib 的一些功能。另外,我故意将 somelib 保留为 Spring Boot 项目,因为我稍后会添加更多与 Spring Boot 相关的功能。

Root Project
  |
  |---settings.gradle
  |---somelib
  |       |
  |       |---build.gradle
  |       |---settings.gradle
  |       |---src/main/kotlin/somepackage/Tester.kt
  |       |---src/main/kotlin/somepackage/SomeLibApplication.kt
  |
  |---multidemo
  |       |---build.gradle
  |       |---settings.gradle
  |       |---src/main/kotlin/somepackage/SampleController.kt
  |       |---src/main/kotlin/somepackage/MultidemoApplication.kt

下面是每个文件的内容

根/settings.gradle

include ':somelib', ':multidemo'

somelib/build.gradle

plugins {
    id 'org.springframework.boot' version '2.1.3.RELEASE'
    id 'org.jetbrains.kotlin.jvm' version '1.3.21'
    id 'org.jetbrains.kotlin.plugin.spring' version '1.3.21'
}

apply plugin: 'io.spring.dependency-management'

group = 'com.simbalarry'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'com.fasterxml.jackson.module:jackson-module-kotlin'
    implementation 'org.jetbrains.kotlin:kotlin-reflect'
    implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

compileKotlin {
    kotlinOptions {
        freeCompilerArgs = ['-Xjsr305=strict']
        jvmTarget = '1.8'
    }
}

compileTestKotlin {
    kotlinOptions {
        freeCompilerArgs = ['-Xjsr305=strict']
        jvmTarget = '1.8'
    }
}

somelib/settings.gradle

pluginManagement {
    repositories {
        gradlePluginPortal()
    }
}
rootProject.name = 'somelib'

somelib/src/main/kotlin/somepackage/Tester.kt

package com.simbalarry.somelib


/*
 * Created on : 17-03-2019
 * Author     : Nayan Kurude
 */

object Tester {
  fun getOutputText(): String {
    return "Sample Text"
  }
}

somelib/src/main/kotlin/somepackage/SomelibApplication.kt

package com.simbalarry.somelib

import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication

@SpringBootApplication
class SomelibApplication

fun main(args: Array<String>) {
    runApplication<SomelibApplication>(*args)
}

multidemo/build.gradle

plugins {
    id 'org.springframework.boot' version '2.1.3.RELEASE'
    id 'org.jetbrains.kotlin.jvm' version '1.3.21'
    id 'org.jetbrains.kotlin.plugin.spring' version '1.3.21'
}

apply plugin: 'io.spring.dependency-management'

group = 'com.simbalarry'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
    mavenCentral()
    mavenLocal()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'com.fasterxml.jackson.module:jackson-module-kotlin'
    implementation 'org.jetbrains.kotlin:kotlin-reflect'
    implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8'
    compile project(':somelib')
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

compileKotlin {
    kotlinOptions {
        freeCompilerArgs = ['-Xjsr305=strict']
        jvmTarget = '1.8'
    }
}

compileTestKotlin {
    kotlinOptions {
        freeCompilerArgs = ['-Xjsr305=strict']
        jvmTarget = '1.8'
    }
}

multidemo/settings.gradle

pluginManagement {
    repositories {
        gradlePluginPortal()
    }
}
rootProject.name = 'multidemo'

multidemo/src/main/kotlin/somepackage/MultiDemoApplication.kt

package com.simbalarry.multidemo

import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication

@SpringBootApplication
class MultidemoApplication

fun main(args: Array<String>) {
    runApplication<MultidemoApplication>(*args)
}

multidemo/src/main/kotlin/somepackage/SampleController.kt

package com.simbalarry.multidemo

import com.simbalarry.somelib.Tester
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController


/*
 * Created on : 17-03-2019
 * Author     : Nayan Kurude
 */

@RestController
class SampleController {

  @RequestMapping("/hello")
  fun hello(): String {
    return Tester.getOutputText()
  }
}

谁能告诉我我哪里做错了。

【问题讨论】:

  • 只有根项目必须有settings.gradle文件。 docs.gradle.org/current/userguide/…。另外,如果 someLib 是一个库,那么它不应该是一个应用程序,不应该有一个主类,也不应该是 spring boot 插件。
  • 如何将 somelib 转换为 Spring Boot 库?我需要 somelib 中的 spring boot 功能。
  • 我从两个项目中删除了 settings.gradle 文件,仍然是同样的错误。
  • 没有“spring boot library”这样的东西。 Spring boot 中使用的库只是一个常规的 Java 库,即包含类的 jar。您需要做的就是编译代码并使其成为一个常规的、标准的、普通的 jar 文件。
  • 我对 gradle 完全陌生,并且自近一周以来一直在努力解决这个问题。您能否告诉我需要对哪个文件进行哪些更改才能使其正常工作?

标签: spring-boot gradle kotlin build


【解决方案1】:

正如我在 cmets 中所说:somelib 应该是一个库。所以它不应该应用spring boot插件,它的作用是创建一个Spring Boot 应用程序

somelib 的 build.gradle 文件应如下所示:

plugins {
    id 'java-library' // 1
    id 'org.springframework.boot' version '2.1.3.RELEASE' apply false // 2
    id 'io.spring.dependency-management' version '1.0.6.RELEASE' //3
    id 'org.jetbrains.kotlin.jvm' version '1.3.21'
    id 'org.jetbrains.kotlin.plugin.spring' version '1.3.21'
}

group = 'com.simbalarry'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
    mavenCentral()
}

dependencyManagement { // 4
    imports {
        mavenBom org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES
    }
}

ext['kotlin.version'] = '1.3.21' // 5

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'com.fasterxml.jackson.module:jackson-module-kotlin'
    implementation 'org.jetbrains.kotlin:kotlin-reflect'
    implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

compileKotlin {
    kotlinOptions {
        freeCompilerArgs = ['-Xjsr305=strict']
        jvmTarget = '1.8'
    }
}

compileTestKotlin {
    kotlinOptions {
        freeCompilerArgs = ['-Xjsr305=strict']
        jvmTarget = '1.8'
    }
}

一些解释(见代码中的cmets):

  1. 应用 java 库 gradle 插件,因为这就是您想要创建的:可以在其他项目中使用的库
  2. 将 Spring Boot 插件添加到构建的类路径而不应用它,以便以后能够使用其 BOM。见https://docs.spring.io/spring-boot/docs/2.1.3.RELEASE/gradle-plugin/reference/html/#managing-dependencies-using-in-isolation
  3. 应用 spring 依赖管理插件,可以通过使用 spring boot BOM 中指定的版本号来指定没有版本的依赖项
  4. 配置依赖管理插件使用spring boot BOM
  5. 用您要使用的版本覆盖 BOM (1.2.71) 中使用的 kotlin 版本。见https://docs.spring.io/dependency-management-plugin/docs/current-SNAPSHOT/reference/html/#dependency-management-configuration-bom-import-override-property

【讨论】:

    猜你喜欢
    • 2020-08-12
    • 2018-07-10
    • 1970-01-01
    • 2020-06-25
    • 2020-06-26
    • 1970-01-01
    • 1970-01-01
    • 2017-03-14
    • 1970-01-01
    相关资源
    最近更新 更多