#spring-boot #gradle #kotlin #build
#весенняя загрузка #gradle #kotlin #сборка
Вопрос:
Я получаю следующую ошибку при запуске команды gradle build в корневой папке.
E:Codemdh>gradle build
> Task :multidemo:compileKotlin FAILED
e: E:CodemdhmultidemosrcmainkotlincomsimbalarrymultidemoSampleController.kt: (3, 23): Unresolved reference: somelib
e: E:CodemdhmultidemosrcmainkotlincomsimbalarrymultidemoSampleController.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
Ниже приведено содержимое каждого файла
Root/ 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()
}
}
Кто-нибудь, пожалуйста, может сказать мне, где я делаю что-то не так.
Комментарии:
1. Файл settings.gradle должен быть только у корневого проекта. docs.gradle.org/current/userguide / … . Кроме того, если someLib является библиотекой, то это не должно быть приложением, не должно иметь основного класса и не должно быть плагина spring boot.
2. Как я могу преобразовать somelib в библиотеку spring boot? Мне нужна функциональность весенней загрузки в somelib.
3. Я удалил файл settings.gradle из обоих проектов, все та же ошибка.
4. Не существует такой вещи, как «библиотека загрузки spring». Библиотека, используемая в Spring boot, является обычной библиотекой Java, то есть jar, содержащей классы. Все, что вам нужно сделать, это скомпилировать код и сделать его обычным, стандартным файлом jar.
5. Я совершенно новичок в gradle и почти неделю пытаюсь решить эту проблему. Не могли бы вы, пожалуйста, сказать мне, какие изменения в каком файле мне нужно внести, чтобы он заработал?
Ответ №1:
Как я уже говорил в комментариях: somelib должен быть библиотекой. Поэтому не следует применять плагин spring boot, роль которого заключается в создании приложения Spring Boot.
Ваш файл build.gradle для somelib
должен выглядеть следующим образом:
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'
}
}
Некоторые пояснения (см. Комментарии в коде):
- Применяет плагин java library gradle, поскольку это то, что вы хотите создать: библиотеку, которую можно использовать в другом проекте
- Добавляет плагин Spring Boot в classpath сборки без его применения, чтобы иметь возможность использовать его спецификацию позже. Смотрите https://docs.spring.io/spring-boot/docs/2.1.3.RELEASE/gradle-plugin/reference/html/#managing-dependencies-using-in-isolation
- Применяет плагин spring dependency management, чтобы иметь возможность указывать зависимости без версии, используя номера версий, указанные в спецификации spring boot
- Настройте плагин управления зависимостями для использования спецификации spring boot
- Замените версию kotlin, используемую в спецификации (1.2.71), той, которую вы хотите использовать. Смотрите https://docs.spring.io/dependency-management-plugin/docs/current-SNAPSHOT/reference/html/#dependency-management-configuration-bom-import-override-property