Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

코틀린 버전을 1.6.21로 올린다. #563

Closed
woowahan-pjs opened this issue Jul 14, 2022 · 2 comments
Closed

코틀린 버전을 1.6.21로 올린다. #563

woowahan-pjs opened this issue Jul 14, 2022 · 2 comments
Assignees
Labels
디자인 Improvements or additions to documentation

Comments

@woowahan-pjs
Copy link
Contributor

woowahan-pjs commented Jul 14, 2022

  • Kotlin: 1.5.10 -> 1.6.21
  • org.jlleitschuh.gradle.ktlint: 10.1.0 -> 10.3.0
  • Gradle: 6.5.1 -> 6.9.2
    • 코틀린 DSL 스크립트 컴파일 개선
    • 자바 툴체인 지원
    • ...

참고 자료

관련 이슈: #246

@woowahan-pjs woowahan-pjs changed the title 코틀린 버전을 1.7.10으로 올린다. 코틀린 버전을 1.6.21로 올린다. Jul 14, 2022
@woowahan-pjs
Copy link
Contributor Author

woowahan-pjs commented Jul 15, 2022

1.6

  • JVM 17에 해당하는 바이트코드 버전으로 클래스를 생성할 수 있다.
  • Exhaustive when이 될 수 있도록 경고 지원(향후 오류로 대체될 예정)
// 1.5
val <T> T.exhaustive: T
   get() = this

enum class Suit {
    CLUBS, DIAMONDS, HEARTS, SPADES
}

fun Suit.toPattern(): String {
    when(this) { // Okay
        Suit.CLUBS -> ""
    }

    when(this) { // Error
        Suit.CLUBS -> ""
    }.exhaustive

    return when(this) { // Error
        Suit.CLUBS -> ""
    }
}
// 1.6
val <T> T.exhaustive: T
   get() = this

enum class Suit {
    CLUBS, DIAMONDS, HEARTS, SPADES
}

fun Suit.toPattern(): String {
    when(this) { // Warning
        Suit.CLUBS -> ""
    }

    when(this) { // Error
        Suit.CLUBS -> ""
    }.exhaustive

    return when(this) { // Error
        Suit.CLUBS -> ""
    }
}
  • readLine()!!에 해당하는 readln() 추가
// 1.5
val name = readLine()!!
val nickname = readLine()
println("Hello, ${nickname ?: name}!")
// 1.6
val name = readln()
val nickname = readlnOrNull()
println("Hello, ${nickname?: name}!")
  • typeOf()
// 1.6
val fromExplicitType: KType = typeOf<Int>()
  • 컬렉션 빌더
// 1.6
val x = listOf('b', 'c')
val y = buildList {
    add('a')
    addAll(x)
    add('d')
}
println(y)  // [a, b, c, d]
  • Duration API
    • java.util.concurrent.TimeUnit -> kotlin.time.DurationUnit
    • Duration.seconds(Int), kotlin.time.seconds -> kotlin.time.Duration.Companion.seconds
// 1.6
val duration = 10000
println("There are ${duration.seconds.inWholeMinutes} minutes in $duration seconds")
// There are 166 minutes in 10000 seconds
  • rotateLeft(), rotateRight()
// 1.6
val number: Short = 0b10001 // 16-bit
println(number.rotateLeft(2).toString(2)) // 1000100
println(number.rotateRight(2).toString(2)) // 100000000000100

@woowahan-pjs
Copy link
Contributor Author

woowahan-pjs commented Jul 17, 2022

1.7

  • 최소 Gradle 버전은 6.7.1
  • 기본 JDK 1.8

문제

스프링 부트 2.3.3에서 코틀린 버전을 1.7.10으로 올리면 아래 예외가 발생한다.

java.lang.NoSuchMethodError: 'java.lang.String org.jetbrains.kotlin.gradle.plugin.KotlinPluginWrapper.getKotlinPluginVersion()'
	at org.springframework.boot.gradle.plugin.KotlinPluginAction.execute(KotlinPluginAction.java:36)
	at org.springframework.boot.gradle.plugin.KotlinPluginAction.execute(KotlinPluginAction.java:32)
	at org.springframework.boot.gradle.plugin.SpringBootPlugin.lambda$registerPluginActions$0(SpringBootPlugin.java:125)
	...

해결 방법

  1. 코틀린 버전을 1.6.21까지 올린다.
  2. 스프링 부트 버전을 2.5.3 이상으로 올린다.

원인

  • 스프링 부트 2.3.3에서는 kotlin.version이 설정되어 있더라도 KotlinPluginWrapperkotlinPluginVersion 프로퍼티를 읽어 온다.
  • 코틀린 1.7.0 Gradle 플러그인에서 kotlinPluginVersion가 제거되고 Project.getKotlinPluginVersion()로 대체되었다.
    • KT-47318 Remove deprecated 'kotlinPluginVersion' property in `KotlinBasePluginWrapper'
    • https://github.com/JetBrains/kotlin/commit/9943b146e985195df1b6f18cbc03851d0bd3c6b1
  • 스프링 부트에서는 2.5.3부터 지원하고 있다.
// 2.3.x
// KotlinPluginAction.java#L34-L42
@Override
public void execute(Project project) {
    String kotlinVersion = project.getPlugins().getPlugin(KotlinPluginWrapper.class).getKotlinPluginVersion();
    ExtraPropertiesExtension extraProperties = project.getExtensions().getExtraProperties();
    if (!extraProperties.has("kotlin.version")) {
        extraProperties.set("kotlin.version", kotlinVersion);
    }
    enableJavaParametersOption(project);
}
// 2.4.x 이후
// KotlinPluginAction.java#L34-L42
@Override
public void execute(Project project) {
    ExtraPropertiesExtension extraProperties = project.getExtensions().getExtraProperties();
    if (!extraProperties.has("kotlin.version")) {
        String kotlinVersion = project.getPlugins().getPlugin(KotlinPluginWrapper.class).getKotlinPluginVersion();
        extraProperties.set("kotlin.version", kotlinVersion);
    }
    enableJavaParametersOption(project);
}
// 2.5.x 이후
// KotlinPluginAction.java#L35-L47
@Override
public void execute(Project project) {
    ExtraPropertiesExtension extraProperties = project.getExtensions().getExtraProperties();
    if (!extraProperties.has("kotlin.version")) {
        String kotlinVersion = getKotlinVersion(project);
        extraProperties.set("kotlin.version", kotlinVersion);
    }
    enableJavaParametersOption(project);
}

private String getKotlinVersion(Project project) {
    return KotlinPluginWrapperKt.getKotlinPluginVersion(project);
}

참고 자료

  • https://github.com/spring-projects/spring-boot/issues/26864
  • https://github.com/spring-projects/spring-boot/issues/27090
  • 스프링 부트 버전 2.5.0부터 kotlin.version을 스프링 부트에서 관리한다.
    • 그러나 여전히 코틀린 Gradle 플러그인 버전을 따른다. (https://github.com/spring-projects/spring-boot/issues/11711)
  • 여담으로 코틀린 1.7.0부터는 자식 프로젝트의 플러그인 버전이 1.6.20 이하일 경우 빌드 오류가 발생한다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
디자인 Improvements or additions to documentation
Projects
None yet
Development

No branches or pull requests

1 participant